Во-первых, если вы можете сделать это только с помощью триггеров стиля (как в ответе Нила Б.), сделайте.Если ваше значение более сложное, вам может потребоваться другая опция ...
Если у вас есть сложные значения для включения шаблонов, вы можете использовать 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>
Селектор шаблона данных затем явно выбирает DataTemplate для предоставления вItemsControl и свойство ItemTemplateSelector ItemsControl являются взаимоисключающими со свойством ItemTemplate (вы не можете установить оба одновременно).