Как вы условно связываете данные?
Как я могу условно связать данные со списком? У меня есть поле со списком, который по умолчанию должен отображать идентификатор. Однако, если пользователь установит флажок, на дисплее должны отображаться как ИД, так и ИМЯ. Например, "OO1: Сэм". У меня ID по умолчанию отображается правильно. Я просто не уверен, как заставить отображаться как ID, так и NAME в зависимости от состояния флажка "IsChecked".
WPF и C# .Net 3.5
2 ответа
Вот один из способов использования стиля в ComboBox с триггерами для динамической установки ItemTemplate:
Изменить: изменение стиля в ресурс. Обратите внимание, что это все еще привязка к CheckBox напрямую с помощью привязки элемента - если вы хотите, чтобы он был более гибким, вы можете связать свойство IsChecked CheckBox со свойством вашей 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. У вас может быть видовая модель для ваших элементов комбинированного окна, другая - для любого экрана, на котором установлен флажок, и какой-то способ, чтобы флажок видовой модели сообщал элементу представления, когда его значение изменилось. Элемент viewmodel затем имеет условную логику в свойстве Text (или как вы его называете) и реализует обычный шаблон INotifyPropertyChanged, чтобы уведомить пользовательский интерфейс об изменении его текста.
Преимущество: таким образом вы можете написать модульные тесты для этого поведения. (И если это стоит вставить, то стоит написать юнит-тесты.)