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

Gre*_*ter 4 data-binding wpf datatemplate

我正在开发一个 WPF 应用程序,目前我有一个ItemsControl绑定到我的视图模型ObservableCollection,我有一个DataTemplate使用 aUserControlcanvas. 您可以使用多个用户控件,然后根据一个来切换使用哪个Enum?另一种查看它的方法是为基于的项目创建 aButton或 a 。TextBoxObservableCollectionEnum

Pet*_*erg 7

您可以使用自定义DataTemplateSelector. 假设我们有以下内容:

public enum Kind
{
    Button, TextBox,
}

public class Data
{
    public Kind Kind { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您的数据模板选择器可能如下所示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 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>
Run Code Online (Sandbox Code Playgroud)

最后,让您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>
Run Code Online (Sandbox Code Playgroud)

(在现实生活中,设置ItemsSource而不是像我一样在内联声明项目。)

为了完整性:要访问您的 C# 类,您需要设置命名空间,例如,

xmlns:local="clr-namespace:WPF"
Run Code Online (Sandbox Code Playgroud)