2016-02-01 99 views
1

我工作的一个WPF应用程序,并选择用户控制数据模板目前我已绑定到我的视图模型ObservableCollectionItemsControl和我有一个使用UserControl上呈现canvas项目一DataTemplate。您可以使用多个用户控件,然后根据Enum切换使用哪一个?另一种查看方法是根据EnumObservableCollection中的项目创建ButtonTextBox基于一个枚举

+0

我是否正确理解您想要基于'Enum'值而不是'ViewModel'来更改'UserControl'? – StepUp

回答

2

您可以使用自定义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" 
+0

梦幻般的回应真的很有帮助。我已经与UserControls合作,这是我的最终目标,非常感谢。 – Grenter

+0

很高兴帮助! –