Как вы условно связываете данные?

Как я могу условно связать данные со списком? У меня есть поле со списком, который по умолчанию должен отображать идентификатор. Однако, если пользователь установит флажок, на дисплее должны отображаться как ИД, так и ИМЯ. Например, "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, чтобы уведомить пользовательский интерфейс об изменении его текста.

Преимущество: таким образом вы можете написать модульные тесты для этого поведения. (И если это стоит вставить, то стоит написать юнит-тесты.)

Другие вопросы по тегам