我们在四个XAML视图中有四个相同的弹出窗口和网格。我想将XAML移动到模板并通过Style应用到所有四个中的ContentControls。麻烦在于传递网格中项目的来源。我们从四种不同的视图模型中获得。在每种情况下都是不同的,这四种情况中唯一不同的是。我可能最终会一直重命名它们,但我想这是一个单独的问题。
显然我根本不懂TemplateBinding。如何将模板的子项的属性绑定到我正在应用模板的ContentControl的属性?
除了DataSource属性的值发生变化外,网格的XAML与我们直接使用时的效果完全相同。
我添加了TextBlock,看看我是否可以绑定任何东西。我在那里得到NaN
。
<Style x:Key="HistoryPopupContentStyle" TargetType="ContentControl">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{TemplateBinding Width,
diag:PresentationTraceSources.TraceLevel=High}"
Background="White"
Foreground="Black"/>
<dxg:GridControl
DataSource="{Binding RelativeSource={RelativeSource
Path=DataContext,
TraceLevel=High}"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
>
<!-- Columns. The grid displays column headers
as desired but with no rows -->
</dxg:GridControl.Columns>
</dxg:GridControl>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<Popup
Name="PopHistory"
DataContext="{Binding Path=HistoryList}"
>
<ContentControl DataContext="{Binding Path=HistoryList}"
Style="{StaticResource HistoryPopupContentStyle}"
Name="Testing"
/>
</Popup>
答案 0 :(得分:3)
您需要继承ContentControl
(或仅Control
),以便添加新的依赖项属性。
public class GridControl : ContentControl
{
// TODO add dependency properties
public GridControl()
{
DefaultStyleKey = typeof(GridControl);
}
}
添加&#34;项目&#34;依赖属性到上面的控件(类型IEnumerable
)。
接下来,更新模板以定位新类型:
<Style x:Key="HistoryPopupContentStyle" TargetType="local:GridControl">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<dxg:GridControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=local:GridControl},Path=Items}" />
或者,您可以设置&#34;模板&#34;而不是&#34; ContentTemplate&#34;。这将是您使用TemplateBinding
:
<Style x:Key="HistoryPopupContentStyle" TargetType="local:GridControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:GridControl">
<dxg:GridControl ItemsSource="{TemplateBinding Items}" />
通过将Items
属性绑定到源项目来使用它:
<local:GridControl Style="{StaticResource HistoryPopupContentStyle}"
Items="{Binding Path=HistoryList}" />
您也可以完全跳过创建子类,只需使用Content
的{{1}}属性来存储项目:
ContentControl
或使用Template / TemplateBinding方法
<Style x:Key="HistoryPopupContentStyle" TargetType="ContentControl">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<dxg:GridControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=local:GridControl},Path=Content}" />
像这样使用:
<Style x:Key="HistoryPopupContentStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<dxg:GridControl ItemsSource="{TemplateBinding Content}" />