データを条件付きでコンボ ボックスにバインドするにはどうすればよいですか? デフォルトでIDを表示するコンボボックスがあります。ただし、ユーザーがチェック ボックスをオンにすると、ディスプレイには ID と名前の両方が表示されます。たとえば、「OO1: サム」。デフォルトの ID が正しく表示されています。チェックボックスの「IsChecked」状態に基づいて ID と NAME の両方を表示する方法がわかりません。
WPF および C# .Net 3.5
データを条件付きでコンボ ボックスにバインドするにはどうすればよいですか? デフォルトでIDを表示するコンボボックスがあります。ただし、ユーザーがチェック ボックスをオンにすると、ディスプレイには ID と名前の両方が表示されます。たとえば、「OO1: サム」。デフォルトの ID が正しく表示されています。チェックボックスの「IsChecked」状態に基づいて ID と NAME の両方を表示する方法がわかりません。
WPF および C# .Net 3.5
これが1つの方法で、トリガー付きのComboBoxのスタイルを使用して、ItemTemplateを動的に設定します。
編集:スタイルをリソースに変更します。これは、要素バインディングを使用して直接CheckBoxにバインドしていることに注意してください。より柔軟にしたい場合は、CheckBoxのIsCheckedプロパティをViewModelのプロパティにバインドし、IsCheckedではなくその変更に依存することができます。
スタイルをウィンドウの[リソース]セクションに移動してみましょう。
<Window.Resources>
<Style x:Key="myStyle" TargetType="ComboBox">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked,ElementName=chk}" Value="True">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" />
<TextBlock Text=": " />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
次に、CheckBoxとそれに依存するいくつかのComboBoxを定義します。
<CheckBox x:Name="chk" Content="Click Me" />
<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" />
<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" />
ViewModelでそれを行います。コンボ ボックス項目用のビューモデル、チェックボックスが存在する画面用の別のビューモデル、および値が変更されたときにチェックボックス ビューモデルが項目ビューモデルに通知する何らかの方法を使用できます。次に、アイテムのビューモデルは、その Text プロパティ (またはそれを呼び出すもの) に条件付きロジックを持ち、通常の INotifyPropertyChanged パターンを実装して、テキストが変更されたときに UI に通知します。
利点: この方法で、この動作の単体テストを作成できます。(そして、それを入れる価値があるなら、単体テストを書く価値があります。)