在xaml中切换以注册不同的控件

时间:2016-04-14 10:23:34

标签: wpf xaml enums

我不确定这是否可行,所以我没有代码示例。基本上我想看看我是否可以切换xaml来插入基于枚举值的特定控件。下面的sodo代码应该给你一个我正在寻找的例子

enum testVariable{ btn = 2, input = 2 }

XAML

xaml switch binding to testvariable
         if testvariable = 1
 <button/>
         if testvaribale = 2
 <textbox/>

基本上我希望在列表中构建一个基于枚举变量的动态表单输入作为结构的一部分。

2 个答案:

答案 0 :(得分:0)

您正在寻找DataTemplateSelector

如果您创建自己的数据,则可以传入任何数据,根据该数据执行选择,然后在选择中返回正确的模板

例如

public class CustomTemplateSelector : DataTemplateSelector
{
    DataTemplate Template1{get;set};
    DataTemplate Template2{get;set};
    DataTemplate Template3{get;set};
    DataTemplate Template4{get;set};

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var data = item as YourDataType
        switch(data.Enum)
        {
           case Enum.Value1:
                return Template1;
           case Enum.Value2:
                return Template2;
           case Enum.Value3:
                return Template3;
           case Enum.Value4:
                return Template4;
           default:
                return null;
        }
    }
}

XAML

<local:CustomeDataTemplate>
    <local:CustomeDataTemplate.Template1>
        <DataTemplate>
            <TextBox />
        </DataTemplate>
    </local:CustomeDataTemplate.Template1>
    <local:CustomeDataTemplate.Template2>
        <DataTemplate>
            <Button/>
        </DataTemplate>
    </local:CustomeDataTemplate.Template2>
</local:CustomeDataTemplate>

答案 1 :(得分:0)

您可以创建自定义DataTemplateSelector,它将根据您的枚举值选择数据模板。

public class EnumDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate ButtonDataTemplate { get; set; }
    public DataTemplate InputDataTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, 
               DependencyObject container)
    {
        var value = (testVariable)item;

        switch (value)
        {
            case testVariable.btn:
                return ButtonDataTemplate;
            case testVariable.input:
                return InputDataTemplate;
        }

        return InputDataTemplate;
    }
}

XAML

<Window x:Class="DataTemplates.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:DataTemplates"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <Window.Resources>

        <!-- DataTemplate for Button -->
        <DataTemplate x:Key="DefaultDataTemplate">
           <Button/>
        </DataTemplate>

        <!-- DataTemplate for Input -->
        <DataTemplate x:Key="InputDataTemplate">
           <TextBox/>
        </DataTemplate>

        <!-- DataTemplate Selector -->
        <l:PropertyDataTemplateSelector x:Key="templateSelector"
              ButtonDataTemplate="{StaticResource ButtonDataTemplate}"
              InputDataTemplate="{StaticResource InputDataTemplate}"/>
    </Window.Resources>
    <Grid>
        <!--List box-->
        <ListBox ItemsSource="{Binding}"
                 HorizontalContentAlignment="Stretch" 
                 ItemTemplateSelector="{StaticResource templateSelector}"/>
        <!--Content control-->
        <ContentControl Content="{Binding}"
                 ContentTemplateSelector="{StaticResource templateSelector}"/>
    </Grid>
</Window>