wpf - 基于枚举为数据模板选择用户控件

标签 wpf data-binding datatemplate

我正在开发一个 WPF 应用程序,目前我有一个 ItemsControl绑定(bind)到我的 View 模型 ObservableCollection我有一个 DataTemplate使用 UserControl渲染 canvas 上的项目.您能否使用多个用户控件,然后根据 Enum 切换使用哪一个? ?另一种查看方式是创建 ButtonTextBox 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/

相关文章:

c# - 向任何自定义控件添加命令属性

c# - 本地数据缓存同步不会将客户端更改保存到 sdf 文件

wpf - 是否可以将 DataTemplate 应用到页面?

wpf - DataTemplate 似乎没有绑定(bind)

wpf - 您必须添加对程序集 'Microsoft.Data.Services.Client.Portable...' 和 NUGET 的引用

C# WPF 使用 DotNetZip 检测提取完成?

WPF - 使用来自另一个程序集的样式/资源

wpf - 是否有一组接口(interface)可以实现以避免在 WPF 绑定(bind)中有转换器

wpf - 比较 DataTrigger 中的两个动态值

wpf - 在 DataTemplates 内绑定(bind)时出现“找不到管理 FrameworkElement ...”警告