根据值动态更改控件的内容

时间:2010-01-02 22:13:40

标签: wpf binding

我想实现以下行为: 根据值使用不同的datatemplate:

 <DataTemplate x:Key="cardTemplate2">
                    <Border x:Name="container">
                     .....
                    </Border>

                  <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding ShowSecondDT}" Value="True">
                      <Setter Property="Child" TargetName="container">
                        <Setter.Value>
                            <StackPanel Orientation="Vertical" >

                            </StackPanel>
                        </Setter.Value>
                      </Setter>
                    </DataTrigger>
                  </DataTemplate.Triggers>
                </DataTemplate>

申请失败,声称Setter Property =“Child”为空...

另一个信息是这个控件资源中的Datatemplate :( devexpress gris)

<dxg:GridControl      xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
x:Name="gridTitulaire"        DataSource="{Binding Contacts}" Width="600" >
                <dxg:GridControl.Resources>

                    <DataTemplate x:Key="cardTemplate2">
                    <Border x:Name="container">
                    <StackPanel Orientation="Horizontal" >

                            </StackPanel>
                    </Border>

                  <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding isTitulairePrincipal}" Value="True">
                      <Setter Property="Child" TargetName="container">
                        <Setter.Value>
                            <StackPanel Orientation="Vertical" >

                            </StackPanel>
                        </Setter.Value>
                      </Setter>
                    </DataTrigger>
                  </DataTemplate.Triggers>
                </DataTemplate>

                </dxg:GridControl.Resources>
                <dxg:GridControl.Columns>

                  <dxg:GridColumn FieldName="first_name"/>
                  <dxg:GridColumn FieldName="last_name"/>

                </dxg:GridControl.Columns>
                <dxg:GridControl.View>
                  <dxg:CardView  x:Name="view" ShowGroupedColumns="True" CardTemplate="{DynamicResource cardTemplate2}"  />
                </dxg:GridControl.View>
              </dxg:GridControl>

有什么想法吗? 谢谢 乔纳森

1 个答案:

答案 0 :(得分:0)

定义两个单独的数据模板(例如,为垂直数据模板调用CardTemplateV,为水平调用它们为CardTemplateH),并将CardTemplateSelector设置为检查区别字段的选择器对象。

示例:

class MyTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var cardData = item as CardData;
        if (cardData == null) return null;
        var dataObject = cardData.DataContext as YourDataType;
        if (dataObject == null) return null;
        if (dataObject.isTitulairePrincipal)
            return (DataTemplate)App.Current.FindResource("CardTemplateV");
        else 
            return (DataTemplate)App.Current.FindResource("CardTemplateH");
    }
}

在XAML中,将选择器添加到资源字典中并从网格中引用它:

<Window.Resources>
    <local:YourTemplateSelector x:Key="MyTemplateSelector"/>
</Window.Resources>
...
<dxg:CardView
    x:Name="view" 
    ShowGroupedColumns="True" 
    CardTemplateSelector="{StaticResource MyTemplateSelector}"/>
...