我想檢查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>
uj5u.com熱心網友回復:
系結失敗,因為它系結了一個型別的實體DishDTOAdvance并將其與描述該型別的實體TypeDishDTOAdvance進行比較。顯然它們是不同的型別,并且條件永遠不會成立。在 XAML中x:Type就像在代碼中一樣。typeof()GetType()
x:Type標記擴展具有與typeof()C# 中的運算子或 Microsoft Visual Basic 中的 GetType 運算子類似的功能。標記擴展為型別為 Type的x:Type屬性提供從字串轉換行為。
這正是 custom 的情況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();
}
}
Create an instance of the converter in a resource dictionary in scope.
<Window.Resources>
<local:TypeConverter x:Key="TypeConverter"/>
</Window.Resources>
Use the converter in the condition binding. Now types are compared.
<Condition Binding="{Binding Converter={StaticResource TypeConverter}}"
Value="{x:Type econemodels:DishDTOAdvance}"/>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446090.html
上一篇:ListViewAlternationIndex:如何使第一列和第一行的前景透明或從第二行和從1開始編號
下一篇:將控制元件的前景色系結到滑鼠懸停
