WPF TemplateBinding到模板化父级的DataContext

时间:2014-05-05 20:34:36

标签: c# wpf xaml binding templatebinding

我们在四个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>

1 个答案:

答案 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}" />