Триггер данных WPF не работает - выбранный индекс ComboBox не устанавливается в 0 - PullRequest
2 голосов
/ 07 февраля 2011

Я хочу установить SelectedIndex ComboBox на 0, когда SelectedItem, с которым он связан, является нулевым с помощью DataTrigger.Но это не работает.Где я иду не так?

xaml выглядит следующим образом:

<ComboBox SelectedItem="{Binding MyObject.color_master, Mode=TwoWay}"  
          ItemsSource="{Binding  MyEntities.color_master}"
          DislayMemberPath="COLOR_DESCRIPTION" >
 <ComboBox.Style>
  <Style TargetType="ComboBox">
    <Style.Triggers>                                
      <DataTrigger Binding="{Binding Path=MyObject.color_master}" Value="{x:Null}">
          <Setter Property="SelectedIndex" Value="0" />
       </DataTrigger>                                
      </Style.Triggers>
  </Style>
 </ComboBox.Style>
</ComboBox>

Здесь MyObject.color_master равен null , но все же DataTriggerне работает!

Мое требование очень простое, когда в выпадающем списке ничего не выделено, я хочу выбрать первый элемент.

1 Ответ

1 голос
/ 07 февраля 2011

Это только предположение, но когда вы используете SelectedItem и SelectedIndex, вы создаете зависимость от реализации WPF: "кто победит?" это вещь реализации. Даже если это где-то задокументировано, это будет означать, что каждый разработчик знает порядок (что тоже не хорошо, потому что вы никогда не знаете, кто будет поддерживать ваш код).

Я думаю, что самое простое, что вы можете здесь сделать, это использовать одну привязку к свойству ViewModel *1005* и позволить ViewModel вычислить значение на основе color_master. Таким образом, конечный результат будет выглядеть так:

<ComboBox SelectedIndex="{Binding MyObjectViewModel.SelectedColorIndex, Mode=TwoWay}"  
          ItemsSource="{Binding  MyEntities.color_master}"
          DislayMemberPath="COLOR_DESCRIPTION" >
</ComboBox>

Обновление: Поскольку вы сказали, что к вашей модели вида нельзя прикоснуться, вот еще один вариант. Напишите свой собственный IValueConverter, который возьмет MyObject.color_master и преобразует его в индекс:

<ComboBox SelectedIndex="{Binding MyObject.color_master, Mode=TwoWay, Converter={StaticResouce ColorMasterToIndexConverter}}"  
          ItemsSource="{Binding  MyEntities.color_master}"
          DislayMemberPath="COLOR_DESCRIPTION" >
</ComboBox>

Где ColorMasterToIndexConverter определено в диктонаре доступных ресурсов (например, в той же коллекции UserControl.Resources).

...