Как вы условно связываете данные? - PullRequest
1 голос
/ 27 октября 2010

Как я могу условно связать данные со списком? У меня есть поле со списком, который по умолчанию должен отображать идентификатор. Однако, если пользователь установит флажок, на дисплее должны отображаться как ИД, так и ИМЯ. Например, «OO1: Сэм». У меня ID по умолчанию отображается правильно. Я просто не уверен, как заставить отображаться как ID, так и NAME в зависимости от состояния флажка «IsChecked».

WPF и C # .Net 3.5

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Вот один из способов использования стиля в 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}" />
1 голос
/ 27 октября 2010

Я бы сделал это во ViewModel.У вас может быть видовая модель для ваших элементов поля со списком, еще одна для любого экрана, на котором установлен флажок, и какой-то способ, чтобы флажок видовой модели сообщал элементам представления, когда его значение изменилось.Модель представления элемента затем имеет условную логику в свойстве Text (или как вы ее называете) и реализует обычный шаблон INotifyPropertyChanged, чтобы уведомить пользовательский интерфейс об изменении его текста.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...