我想检查ListBox元素是否有一个特定的类型来指定视觉样式,但是常量检查失败了。也许我做错了?
这一行的问题是:
Condition Binding="{Binding}" Value="{x:Type econemodels:DishDTOAdvance}"<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>发布于 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在可视化树上的资源中找到。当然,如果不想在所有资源中搜索,也可以通过属性分配数据模板。
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,它现在由选择器自动分配。
<ListBox ...>
<ListBox.ItemTemplateSelector>
<local:TypeTemplateSelector/>
</ListBox.ItemTemplateSelector>
<!-- ...other markup. -->
</ListBox>ContentControl是多余的。但是,如果在项目模板中需要它,它的工作原理也是一样的。ContentControl出于同样的目的公开了一个ContentTemplateSelector属性。
奖金回合:触发不可能吗?不是的。您可以创建一个返回类型的转换器。
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();
}
}在范围内的资源字典中创建转换器的实例。
<Window.Resources>
<local:TypeConverter x:Key="TypeConverter"/>
</Window.Resources>在条件绑定中使用转换器。现在比较类型。
<Condition Binding="{Binding Converter={StaticResource TypeConverter}}"
Value="{x:Type econemodels:DishDTOAdvance}"/>https://stackoverflow.com/questions/71495688
复制相似问题