首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiDataTrigger.Conditions检查绑定类型

MultiDataTrigger.Conditions检查绑定类型
EN

Stack Overflow用户
提问于 2022-03-16 10:45:50
回答 1查看 39关注 0票数 -1

我想检查ListBox元素是否有一个特定的类型来指定视觉样式,但是常量检查失败了。也许我做错了?

这一行的问题是:

代码语言:javascript
复制
Condition Binding="{Binding}" Value="{x:Type econemodels:DishDTOAdvance}"
代码语言:javascript
复制
<ListBox.ItemTemplate>
    <DataTemplate>
        <ContentControl Content="{Binding}">    
            <ContentControl.Style>
                <Style TargetType="ContentControl">
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                    
                                <Condition Binding="{Binding}"
                                           Value="{x:Type econemodels:DishDTOAdvance}" />
                    
                            </MultiDataTrigger.Conditions>
                            <Setter Property="ContentTemplate"
                                    Value="{StaticResource DishNoImage}" />
                        </MultiDataTrigger>
                    
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
    </DataTemplate>
</ListBox.ItemTemplate>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-16 11:20:52

绑定失败,因为它绑定DishDTOAdvance类型的实例,并将其与描述DishDTOAdvance类型的 的实例进行比较。显然,他们是不同的类型和条件从来不是真的。在XAML中,x:Type与代码中的typeof()GetType()类似。

x:Type标记扩展具有与C#中的typeof()运算符或Microsoft中的GetType运算符类似的功能。x:Type标记扩展为接受类型类型的属性提供了字符串转换行为。

这正是自定义DataTemplateSelector的情况,不需要绑定。

提供了一种基于数据对象和数据绑定元素选择DataTemplate的方法。

使用数据模板选择器,您可以提供任意逻辑来为项选择数据模板。在您的示例中,类型的switch语句足以选择一个模板,该模板可以通过FindResource在可视化树上的资源中找到。当然,如果不想在所有资源中搜索,也可以通过属性分配数据模板。

代码语言:javascript
复制
public class TypeTemplateSelector : DataTemplateSelector
{
   public override DataTemplate SelectTemplate(object item, DependencyObject container)
   {
      var contentPresenter = (ContentPresenter)container;

      switch (item)
      {
         case DishDTOAdvance _:
            return (DataTemplate)contentPresenter.FindResource("DishNoImage");
         // ...other type cases.
         default:
            return base.SelectTemplate(item, container);
      }
   }
}

创建数据模板选择器的实例并将其添加到ListBox中。完全删除ItemTemplate,它现在由选择器自动分配。

代码语言:javascript
复制
<ListBox ...>
   <ListBox.ItemTemplateSelector>
      <local:TypeTemplateSelector/>
   </ListBox.ItemTemplateSelector>
   <!-- ...other markup. -->
</ListBox>

ContentControl是多余的。但是,如果在项目模板中需要它,它的工作原理也是一样的。ContentControl出于同样的目的公开了一个ContentTemplateSelector属性。

奖金回合:触发不可能吗?不是的。您可以创建一个返回类型的转换器。

代码语言:javascript
复制
public class TypeConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return value?.GetType();
   }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      throw new InvalidOperationException();
   }
}

在范围内的资源字典中创建转换器的实例。

代码语言:javascript
复制
<Window.Resources>
   <local:TypeConverter x:Key="TypeConverter"/>
</Window.Resources>

在条件绑定中使用转换器。现在比较类型。

代码语言:javascript
复制
<Condition Binding="{Binding Converter={StaticResource TypeConverter}}"
           Value="{x:Type econemodels:DishDTOAdvance}"/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71495688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档