【问题标题】:Dynamically change the content of of control based on a value根据一个值动态改变控件的内容
【发布时间】:2010-01-02 22:13:40
【问题描述】:

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

 <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>

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

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

    定义两个单独的数据模板(例如,将它们称为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}"/>
    ...
    

    【讨论】:

    • 好的,看起来方法是对的。但是 var dataObject = item as YourDataType;行返回 DevExpress.Wpf.Grid.CardData 类型...不是我的对象...
    • 好的,我将修改我的示例,或者您可以继续自己做,只需从 DataContext 属性中提取您的数据对象。
    • 好的,经过一些其他的事情(我不得不手动从网格中检索值)它可以工作了!你怎么知道 devexpress 网格有一个 CarTemplateSelector ?不管怎样,你做到了。谢谢!!!!!!
    • WPF 中的一般做法是,无论您有ItemTemplate,您也有一个ItemTemplateSelector,所以我推断并搜索了CardTemplateSelector,发现它存在...顺便说一句,@我在上面的示例中编写的 987654328@ 方法不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多