Триггер Combobox не работает для установки выбранного индекса - PullRequest
1 голос
/ 23 ноября 2011

У меня есть ситуация, когда мне нужно установить SelectedIndex моего комбинированного списка на 0, если selectedItem удаляется из коллекции ItemsSource. Небольшой образец хорошо воспроизводит эту ситуацию -

Xaml

<Grid>
   <ComboBox x:Name="cmb" ItemsSource="{Binding Names}" VerticalAlignment="Top">
     <ComboBox.Style>
       <Style TargetType="ComboBox">
         <Style.Triggers>
             <Trigger Property="SelectedValue" Value="{x:Null}">
                <Setter Property="SelectedIndex" Value="0"/>
             </Trigger>
         </Style.Triggers>
       </Style>
     </ComboBox.Style>
  </ComboBox>
  <Button VerticalAlignment="Bottom" Width="100" Height="20" Click="Button_Click"/>
</Grid>

Я не привязал свой SelectedItem или SelectedIndex к какому-либо значению. При загрузке триггер работает нормально и устанавливает SelectedIndex в 0, но при нажатии кнопки я удаляю текущий selectedItem из коллекции Names. Следовательно, выбранное значение установлено равным нулю. Но в этом случае триггер не срабатывает, и поле со списком становится пустым.

Я знаю, что это можно решить с помощью кода, прослушивая событие SelectionChanged и устанавливая SelectedIndex обратно на 0, если currentItem равен нулю. Но я не могу использовать этот подход из-за некоторых ограничений. Я хочу немного чистого подхода xaml. Заранее спасибо ..

EDIT

Установка IsSynchronizedWithCurrentItem в True для выпадающего списка, предотвращает пустоту выпадающего списка, но при удалении selectedItem из коллекции ItemSource устанавливает следующее доступное значение, которое будет выбрано, но я хочу, чтобы мой первый элемент был выбран.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Я думаю, это потому, что вы не можете иметь то же значение внутри триггера, на котором основан триггер, и, по сути, SelectedValue, 'SelectedItem' и SelectedIndex - это просто разные способы обращения к одному и тому же элементу..

Обратите внимание, если вы добавите цвет фона к триггеру, он будет применен, так что триггер определенно работает.

Я не уверен, какие у вас ограничения, которые вы говоритемешают вам использовать SelectionChanged, однако я часто вижу, что люди говорят такие вещи, потому что они являются новичками в шаблоне проектирования MVVM, и думают, что это означает, что приложение вообще не должно иметь никакого кода.Это неверно.

Использование MVVM означает, что в выделенном коде не должно быть бизнес-логики.Логика пользовательского интерфейса совершенно приемлема в коде за представлением, и я считаю, что это логика пользовательского интерфейса, поскольку единственное, что он делает, - это изменение пользовательского интерфейса на основе значения пользовательского интерфейса.

0 голосов
/ 23 ноября 2011

Так как вы в любом случае удаляете выбранный элемент в button_Click, не могли бы вы выполнить то, что вы хотите, установив нулевое значение selectedIndex в обработчике Button_Click (отправитель, eventargs) после удаления текущего выбранного элемента!

...