我正在开发一个WPF应用程序,目前我有一个ItemsControl
绑定到我的View Model ObservableCollection
,我有一个DataTemplate
使用UserControl
在canvas
上呈现项目。您可以使用多个用户控件,然后根据Enum
切换使用哪一个吗?另一种方法是根据Enum
为ObservableCollection
中的项创建Button
或TextBox
。
我正在开发一个WPF应用程序,目前我有一个ItemsControl
绑定到我的View Model ObservableCollection
,我有一个DataTemplate
使用UserControl
在canvas
上呈现项目。您可以使用多个用户控件,然后根据Enum
切换使用哪一个吗?另一种方法是根据Enum
为ObservableCollection
中的项创建Button
或TextBox
。
您可以使用自定义的DataTemplateSelector
为项目选择数据模板。 假设我们有以下内容:
public enum Kind
{
Button, TextBox,
}
public class Data
{
public Kind Kind { get; set; }
public string Value { get; set; }
}
:
public class MyTemplateSelector : DataTemplateSelector
{
public DataTemplate ButtonTemplate { get; set; }
public DataTemplate TextBoxTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Data data = (Data)item;
switch (data.Kind)
{
case Kind.Button:
return ButtonTemplate;
case Kind.TextBox:
return TextBoxTemplate;
}
return base.SelectTemplate(item, container);
}
}
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="ButtonTemplate" DataType="local:Data">
<Button Content="{Binding Value}" />
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate" DataType="local:Data">
<TextBox Text="{Binding Value}" />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
ItemsControl
创建一个自定义模板选择器的实例,并从上面的数据模板初始化它的两个DataTemplate
属性。<ItemsControl>
<ItemsControl.ItemTemplateSelector>
<local:MyTemplateSelector
ButtonTemplate="{StaticResource ButtonTemplate}"
TextBoxTemplate="{StaticResource TextBoxTemplate}"/>
</ItemsControl.ItemTemplateSelector>
<ItemsControl.Items>
<local:Data Kind="Button" Value="1. Button" />
<local:Data Kind="TextBox" Value="2. TextBox" />
<local:Data Kind="TextBox" Value="3. TextBox" />
<local:Data Kind="Button" Value="4. Button" />
</ItemsControl.Items>
</ItemsControl>
在实际应用中,应该设置ItemsSource
而不是像我这样内联声明项目。
为了完整起见:要访问您的C#类,您需要设置命名空间,例如:
xmlns:local="clr-namespace:WPF"
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Content"
Value="{StaticResource YourDefaultLayout}" />
<Style.Triggers>
<DataTrigger Binding="{Binding YourEnumVMProperty}"
Value="{x:Static local:YourEnum.EnumValue1}">
<Setter Property="Content"
Value="{StaticResource ContentForEnumValue1}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourEnumVMProperty}"
Value="{x:Static local:YourEnum.EnumValue2}">
<Setter Property="Content"
Value="{StaticResource ContentForEnumValue2}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
您也可以使用触发器设置器定义整个控件的模板。
我更喜欢这种方式,因为不需要定义所有DataTemplateSelector等内容。
Enum
值而不是ViewModel
来更改您的UserControl
? - StepUp