2016-08-22 9 views
0

コンテンツがデータコンテキストのプロパティに完全に依存するWPFコントロールがあります。このために、コントロールのDataContextがInStock、OutOfStock、またはDiscontinuedのStatusプロパティを持つProduct型のものであるとしましょう。プロパティ値のWPF Decorator子ベースの変更

私は、これらのステータスタイプごとに個別のユーザーコントロールを用意しています。私は、Product.Statusにそれぞれの可視性を結びつける何らかの種類のパネルを作成できました。しかし、いくつかのユーザーコントロールは、設定されているさまざまなプロパティに依存するため、いくつかのユーザーコントロールがファンキーなものになってしまったため、問題が発生しました。そして私の実際のアプリケーションでは、多くのステータスがあるので、visualtreeは自分の好みに合わせて大きすぎます。

私はコードを作成して問題を解決しました。私はDataContextのステータス変更をチェックし、大きなswitch文で適切な子を設定します。可能であれば、XAMLでこれを行いたいと思います。私は子供が必要に応じて設定されるようにしたいので、私はテンプレートを使う必要があると思います。このようなもの: SwitchControlはDecoratorやBorderから派生します。

<SwitchControl Property="Status"> 
    <SwitchControl.Possibilities> 
    <Possibility Value="Discontinued"> 
     <Possibility.Template> 
      <DiscontinuedView /> 
     </Possibility.Template> 
    </Possibility> 
    <Possibility Value="InStock"> 
     <Possibility.Template> 
      <InStockView /> 
     </Possibility.Template> 
    </Possibility> 
    <SwitchControl.Possibilities /> 
</SwitchControl> 

私は全部を短くすることができればそれも良いだろう。

<SwitchControl> 
    <Possibility Value="Discontinued"> 
     <DiscontinuedView /> 
    </Possibility> 
    <Possibility Value="InStock"> 
     <InStockView /> 
    </Possibility> 
</SwitchControl> 

ポイントビーイング、唯一の子は、任意の時点で存在することになります。誰でもこれを行う方法を知っていますか?私はMVVMのフレームワークを見回し、何も見つかりませんでした。それ以外の場合は、自分でカスタムコントロールを作成してみましょう。

+0

可能な方法の1つは、プロパティのトリガを作成し、トリガ設定ツールでコントロールテンプレートを変更することです。異なるテンプレートを別々に定義し、リソースに保存することができます – ASh

答えて

0

DataTemplateSelector classをご覧ください。これにより、さまざまな基準に基づいてテンプレートを定義できます。現在のタイプはDataContextです。

public class MyDataTemplateSelector : DataTemplateSelector 
{ 
      public DataTemplate DiscontinuedDataTemplate { get; set; } 
    public DataTemplate InStockDataTemplate { get; set; } 
    public DataTemplate OutOfStockDataTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var product = item as Product; 
     switch (product.Status) 
     { 
      case Status.InStock: 
       return InStockDataTemplate; 
      case Status.Discontinued: 
       return DiscontinuedDataTemplate; 
      case Status.OutOfStock: 
       return OutOfStockDataTemplate; 
     } 
     // Fallback 
     return DiscontinuedDataTemplate; 
    } 
} 

を...と、以下の方法でそれを使用します:例では、やや次のようになり提案andreaskため

<Window.Resources> 
    <DataTemplate x:Key="DiscontinuedDataTemplate"> 
     <DiscontinuedView /> 
    </DataTemplate> 

    <DataTemplate x:Key="InStockDataTemplate"> 
     <InStockView /> 
    </DataTemplate> 

    <DataTemplate x:Key="OutOfStockDataTemplate"> 
     <OutOfStockView /> 
    </DataTemplate> 

    <!-- DataTemplate Selector --> 
    <local:MyDataTemplateSelector x:Key="MyTemplateSelector" 
      DiscontinuedDataTemplate="{StaticResource DiscontinuedDataTemplate}" 
      InStockDataTemplate="{StaticResource InStockDataTemplate}" 
      OutOfStockDataTemplate="{StaticResource OutOfStockDataTemplate}"/> 
</Window.Resources> 

<ContentControl ContentTemplateSelector="{StaticResource MyTemplateSelector}" Content="{Binding Product}"/> 
0

感謝を。私は、問題をより直接的に解決すると思うコントロールを作成しました。私は将来的にnugetする投稿しますWPFヘルパーライブラリに取り組んできましたが、あなたは今、それを使用したい場合は、それはである:

https://gist.github.com/StevePotter/b17f8d4b2657a2d2610390a11fb57e03

XAMLが含まれている例。私はこれが誰かにとって有益だと思っています!

関連する問題