我正在开发一个 WPF 应用程序,目前我有一个 ItemsControl
绑定(bind)到我的 View 模型 ObservableCollection
我有一个 DataTemplate
使用 UserControl
渲染 canvas
上的项目.您能否使用多个用户控件,然后根据 Enum
切换使用哪一个? ?另一种查看方式是创建 Button
或 TextBox
ObservableCollection
中的项目基于 Enum
.
最佳答案
您可以使用自定义 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);
}
}
在 XAML 中,为您想要涵盖的所有情况声明模板,在本例中为按钮和文本框:
<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"
关于wpf - 基于枚举为数据模板选择用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35140959/