2012-04-03 7 views
1

これと定義されたオブジェクトのコレクションにバインドされたComboBoxがあります。日付ピッカー: 多くのコントロールのうちの1つだけを別のコントロールの値に基づいて表示させる

public class TierOption 
{ 
    public string Option { get; set; } 
    public Type DataType { get; set; } 
} 
public class TierOptions : ObservableCollection<Tier1Option> 
{ 

} 

私はテキストボックス、コンボボックス、またはWPFToolKitあり、このコンボボックスに関連する3つの他のコントロールを、持っています。

最初のComboBoxで選択されたオブジェクトのデータ型(型)に対応する関連コントロールのみを表示する必要があります。

擬似コード例: (虐殺C#におそらくあまりにも近いがうまくいけば、それはアイデアを伝える)

switch (ComboBox.SelectedItem.DataType) 
{ 
    case String: 
      TextBox.Visibility = Visibility.Visible; 
      ComboBox.Visibility = Visibility.Hidden; 
      DatePicker.Visibility = Visibility. Hidden; 
    break; 
    case DateTime: 
      TextBox.Visibility = Visibility.Hidden; 
      ComboBox.Visibility = Visibility.Hidden; 
      DatePicker.Visibility = Visibility. Visible; 
    break; 
    <...so forth and so on...> 
} 

私の試みは関係なく、動作しない複雑台無しに見て非常に非WPFをもたらしてきました。私は最高のデザインプラクティスに真剣に取り組んでいます。

ありがとうございました!

答えて

4

あなたはDataTypeプロパティ

<...Resources> 
    <DataTemplate DataType="{x:Type sys:String}"> 
     <TextBox Text="{Binding}"/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type DateTime}"> 
     <DatePicker .../> 
    </DataTemplate> 
    ... 
</...Resources> 

<ContentControl Content="{Binding SelectedItem, ElementName=myComboBox}"/> 

<ComboBox ItemsSource="{Binding ...}"/> 

上記のコードは単なるアイデアであるとのDataTemplateで遊ぶことができ、あなたはのadjustementsをしなければならない可能性があります。たとえば、文字列アイテム自体を変更することはできません(リストの各アイテムをカプセル化する必要があります)

リストに同じタイプのアイテムがすべて含まれている場合は、ContentControlでContentTemplateSelectorを使用できます。

ContentControl Content="{Binding SelectedItem, ElementName=YourCombBox}" ContentTemplateSelector="{StaticResource YourTemplateSelector}" 

MSDN DOC about ContentControl.ContentTemplateSelector Property

+0

+1私はこの考えがトリガーを使用する私の考えよりも優れていると思います。コントロールの量が増えると、トリガーによってコントロールが難しくなります。必要に応じて後でさらに多くのコントロールを追加するのは簡単なので、別のデータテンプレートを使用すると、imhoに行くことができます。 – dowhilefor

+0

これは、最初のComboBoxの各オブジェクトが特定のタイプのものであっても、すべてのオブジェクトがDataTypeを定義するプロパティを持つ同じタイプ(TierOption)である場合に動作するように思えます。私は何かを誤解していますか? – elo

+0

@elo申し訳ありませんが、あなたは正しいです!私はあまりにも速いので、あなたがあなたのリストに入れたオプションのそれぞれのタイプのクラス(TierOptionから継承するクラス)を作らなければなりません。 – Jonas

0

のElementName =コンボボックスパス= SelectedItem.DataTypeの詳細の可視性に結合します。また、可視性を返すコンバータを使用する必要があります。 2つのコンバータが逆の応答を返す必要があります。 2つ以上の組み合わせがある場合は、Jonasのラインでもう少し組み合わせてください。

私は、タイプがシステムクラスであり、それがカスタムクラスであると考えました。追加のプロパティを持つようにそのクラスを拡張します。 Typeがシステム型であっても、それを実装して拡張するクラスを作成するだけで済みます。

public Visibility TextBoxVisibility { get; } 
    public Visibility ComboBoxVisibility { get; } 
    ... 

    Then on TextBox bind the visibility 

    Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]"; 
関連する問題