[英]How Can I Select an ItemTemplate Based on a Value?
我有一組要在ItemsControl
顯示的對象,並且要根據每個對象中的值顯示不同的ItemTemplate / DataTemplate。 我知道您可以使用不同的對象類型來執行此操作,但是可以基於值來執行此操作嗎?
public class MyItem {
public int MyValue { get; set; }
}
public ObservableCollection<MyItem> MyItems { get; set; }
<ItemsControl ItemsSource="{Binding Path=MyItems}">
<!--If MyValue == 1-->
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBox/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<!--If MyValue == 2-->
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<CheckBox/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<!--If MyValue == 3-->
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<ComboBox/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
是的,您將為此使用觸發器。
<ItemsControl ItemsSource="{Binding Path=MyItems}">
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<!--default template-->
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding MyValue}" Value="1">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<TextBox/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding MyValue}" Value="2">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<CheckBox/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding MyValue}" Value="3">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<TextBox/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
</ItemsControl>
首先,如果您僅可以使用樣式觸發器(如Neil B的回答)就可以做到。 如果您的價值更復雜,則可能需要其他選擇...
當您具有復雜的值來打開模板時,可以使用DataTemplateSelector
。 這會增加一些開銷/復雜性,但會帶來更多選擇。
public class MyDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is MyItem myItem)
{
switch (myItem.MyValue)
{
case 1:
return element.FindResource("TextBoxResource") as DataTemplate;
case 2:
return element.FindResource("CheckBoxResource") as DataTemplate;
case 3:
return element.FindResource("ComboBoxResource") as DataTemplate;
}
}
return null; // or provide a default template
}
}
然后在您的XAML中:
<App.Resources>
<!-- these resources can be in any context such as app, window, or user control, they just need to be in scope -->
<DataTemplate x:Key="TextBoxResource">
<Grid>
<TextBox/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="CheckBoxResource">
<Grid>
<CheckBox/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="ComboBoxResource">
<Grid>
<ComboBox/>
</Grid>
</DataTemplate>
<MyDataTemplateSelector x:Key="myDataTemplateSelector"/>
</App.Resources>
<ItemsControl ItemsSource="{Binding Path=MyItems}"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}">
</ItemsControl>
然后,數據模板選擇器顯式選擇要提供給ItemsControl的DataTemplate,而ItemsControl的ItemTemplateSelector屬性與ItemTemplate屬性互斥(不能同時設置兩者)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.