1

私は非常に使い方と実装の仕方を混同していますが、特定のグリッドを変更するとEnumプロパティに基づいています。WPF DataTemplate、TemplateSelectors、ContentPresenter SelectedItemに基づいて

現在、私は20グリッドのように、プロパティが変更されたときに可視性を利用しています。 これは2つの事柄には理想的ではありません。すべての20のグリッドは起動時にバインドされ、パフォーマンスは良好ではありません。第2に、いくつかの "グリッド"はenumプロパティのいくつかの値で同じです。だから私はいくつかのグリッドでコードを重複している。

は、今、私が持っているもの列挙型です:

Public class MyObject 
{ 
    private Enums.MyEnumsForDropDown _myChosenEnum; 
    public Enums.MyEnumsForDropDown MyChosenEnum 
    { 
    get { return _myChosenEnum; } 
    set 
    { 
     _myChosenEnum = value; 
     this.NotifyPropertyChanged(x => x.MyChosenEnum); 
    } 
    } 
} 

私のXAML::私がバインド私のViewModelで

public enum MyEnumsForDropDown 
    { 
     Enum1= 1, 
     Enum2= 2, 
     Enum3= 3, 
     Enum4= 4, 
     Enum5= 5 
    } 

私のオブジェクトは、のためである

どう
<ComboBox ItemsSource="{Binding CollectionOfEnums}" 
DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding 
MyObject.MyChosenEnum}"></ComboBox> 

<Grid Grid.Row="1" Grid.Column="3" Visibility="{Binding 
Path=MyObject.MyChoseEnum, Converter={StaticResource 
EnumToVisibleCollapseConverter}, ConverterParameter={x:Static 
myenumsNameSpace:Enums+MyEnumsForDropDown.Enum1}}"> 
    <TextBlock Content"This Grid displays when Enum1 is chosen"/> 
</Grid> 

<Grid Grid.Row="1" Grid.Column="3" Visibility="{Binding 
Path=MyObject.MyChoseEnum, Converter={StaticResource 
EnumToVisibleCollapseConverter}, ConverterParameter={x:Static 
myenumsNameSpace:Enums+MyEnumsForDropDown.Enum2}}"> 
    <TextBlock Content"This Grid displays when Enum2 is chosen"/> 
</Grid> 

どうやらContentPresentersやDataTemplatesのように動作するようにグリッドを変更するか、またはMyChoプロパティ私のオブジェクトのsenEnumの変更??

+0

このようなアプローチの欠点は、すべてのグリッドがビジュアルツリーにあることです(dis可視性に関して)、いくつかのパフォーマンスを拘束し、食べることに参加する。代わりに、データトリガーを使用して単一要素の制御テンプレートを変更することができます。複雑なケースでは複数のデータトリガーがあります。 [チュートリアル](http://www.wpf-tutorial.com/styles/multi-triggers-multitrigger-multidatatrigger/)を参照してください。 – Sinatr

答えて

2

あなたは、各列挙値のためDataTemplateを定義して、正しいものを表示するようにStyleContentControlを使用することができます。

<ContentControl Content="{Binding MyObject.MyChosenEnum}"> 
    <ContentControl.Resources> 
     <DataTemplate x:Key="Enum1"> 
      <Grid /> 
     </DataTemplate> 
     <DataTemplate x:Key="Enum2"> 
      <Grid /> 
     </DataTemplate> 
    </ContentControl.Resources> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyObject.MyChosenEnum}" 
          Value="{x:Static myenumsNameSpace:Enums+MyEnumsForDropDown.Enum1}"> 
        <Setter Property="ContentTemplate" Value="{StaticResource Enum1}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding MyObject.MyChosenEnum}" 
          Value="{x:Static myenumsNameSpace:Enums+MyEnumsForDropDown.Enum2}"> 
        <Setter Property="ContentTemplate" Value="{StaticResource Enum2}" /> 
       </DataTrigger> 
       <!-- and so on for each enum value --> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

それともDataTemplateSelectorを使用することができます。

public class YourSelector : DataTemplateSelector 
{ 
    public DataTemplate Enum1 { get; set; } 
    public DataTemplate Enum2 { get; set; } 
    //... 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     MyEnumsForDropDown value = (MyEnumsForDropDown)item; 
     switch(value) 
     { 
      case MyEnumsForDropDown.Enum1: 
       return Enum1; 
      case MyEnumsForDropDown.Enum2: 
       return Enum2; 
     } 

     return base.SelectTemplate(item, container); 
    } 
} 

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="Enum1"> 
      <Grid /> 
     </DataTemplate> 
     <DataTemplate x:Key="Enum2"> 
      <Grid /> 
     </DataTemplate> 
     <local:YourSelector x:Key="selector" Enum1="{StaticResource Enum1}" Enum2="{StaticResource Enum2}" /> 
    </Grid.Resources> 
    <ContentControl Content="{Binding MyObject.MyChosenEnum}" 
        ContentTemplateSelector="{StaticResource selector}" /> 
</Grid> 
+0

ありがとう、私は第二の選択肢に行きました – user1702369

関連する問題