wpf - 从 DataTemplate 在父 ContentPresenter 上设置附加属性
问题描述
我有一个Grid
和它的某个地方ContentControl
:
<Grid Name="OuterGrid">
<!-- some controls on the grid -->
<ContentControl Name="dbg1" Content="{Binding Mode=OneWay}" ContentTemplateSelector="{StaticResource SBATemplateSelector}"></ContentControl>
<!-- some more controls on the grid -->
</Grid>
模板选择器并不是很有趣:
<src:SBATemplateSelector x:Key="SBATemplateSelector"
NormalTemplate="{StaticResource SBAreaTemplate1}"
BigTemplate="{StaticResource SBAreaTemplate2}" />
但是从模板中,我想通过设置Grid.Row
等附加属性来提供内容并将其定位在“OuterGrid”中:
<DataTemplate x:Key="SBAreaTemplate1" DataType="src:XCViewModel">
<DataTemplate.Resources>
<Style TargetType="ContentPresenter"> <!-- should go for only the 'parent' contentpresenter -->
<Setter Property="Grid.Row" Value="4" />
<Setter Property="Grid.Column" Value="0" />
<Setter Property="Grid.RowSpan" Value="5" />
<Setter Property="Grid.ColumnSpan" Value="10" />
</Style>
</DataTemplate.Resources>
<Border Name="sbAreaBorder" BorderThickness="1" BorderBrush="Black">
<ScrollViewer Name="sblbScroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<StackPanel Orientation="Vertical">
<ItemsControl Name="notRelevantListBox" ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource NotRelevantSelector}" />
</StackPanel>
</ScrollViewer>
</Border>
</DataTemplate>
所以我什至不想要绑定,只是将属性设置为静态值。无论我做什么,我都无法让属性ContentPresenter
在DataTemplate
.
几乎有可用的解决方案(例如https://social.msdn.microsoft.com/Forums/vstudio/en-US/cc9ed724-600e-415a-b775-bae09eea66f8/cant-use-attached-properties-inside-a-datatemplate ?forum=wpf),但他们总是应用一个ItemsControl
- 我没有一个ItemsControl
,我希望定位适用于整个DataTemplate
.
解决方案
ContentTemplate
无法设置 的和Grid.Row
附加Grid.Column
属性ContentControl
。该模板仅适用Content
于ContentControl
.
但是您可以在您的以下程序中以编程方式执行此操作ContentTemplateSelector
:
public class SBATemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item != null)
{
ContentPresenter cp = container as ContentPresenter;
if (cp != null)
{
ContentControl cc = VisualTreeHelper.GetParent(cp) as ContentControl;
if (cc != null)
{
Grid.SetRow(cc, 4);
Grid.SetColumn(cc, 0);
Grid.SetRowSpan(cc, 5);
Grid.SetColumnSpan(cc, 10);
}
}
}
...
}
}
推荐阅读
- keras - 使用 Keras LSTM 预测未来值
- javascript - JS Array.prototype.sort() 在 Firefox 中失败,在 Chrome 中有效
- python - 为分类问题添加注意力机制
- arrays - 从数组中的工作表返回值
- jquery - 在jQuery中比较2个输入与多行
- python - 如何二进制图像,使用python通过阈值点将零和一分配到二维图像并将其转换为RGB?
- angular - Angular Material 波纹溢出 Safari 中的按钮
- bash - 在 bash 中运行多个命令并创建新目录并将 csv 文件移动到新目录中
- javascript - 具有(OFF-PENDING-ON)状态的开关的自定义组件:ReactJS
- json - 类型错误:在 reactjs 中使用 fetch 读取 json 时未定义项目