2012-02-21 3 views
1

У меня есть ComboBox, содержимое которого может измениться. Проблема заключается в том, когда содержимое изменяется, 1) я теряю предыдущий selectedIndex, а 2) SelectedIndex установлен в -1. Мне хотелось бы решение MVVM, а не какое-то решение, связанное с кодом. Я могу установить значение SelectedIndex равным 0 при изменении содержимого, но -1 не является допустимым значением для моей модели.ComboBox SelectedIndex потерян при изменении контента

То, что я сделал как «трюк», состояло в том, чтобы установить свойство свойства, связанного с SelectedIndex, чтобы установить значение 0, когда значение установлено на -1. Итак, теперь у меня нет неправильной стоимости в моей модели. Но ComboBox не отображает «0» -й элемент, а пустой.

Что я могу сделать, чтобы мой ComboBox отображал первый элемент (индекс 0) при изменении его содержимого?

<ComboBox Name="WeeksComboBox"  IsEditable="False" 
             ItemsSource="{Binding Weeks}" 
             SelectedIndex="{Binding WeekNumber}" 
             > 

Недели - это свойство уведомления, которое представляет собой список строк. Он изменяется, когда я изменяю свойство Year. WeekNumber является уведомляющим свойством типа integer. Теперь, когда он установлен в -1, я устанавливаю соответствующий частный член на 0, чтобы избежать неправильного значения в моей модели.

+0

Я подозреваю, что вы подменой, как будет установлен выбранный индекс -1. Отправьте код, в который вы привязываетесь, и где вы меняете контент. – Paparazzi

+1

Когда вы говорите, что «изменилось время, когда меняют год», вы очищаете этот список - если это так, когда он получает значение -1, поскольку нет значений (пока вы не добавите новые значения). Если вы делаете ясный, то добавьте, вам нужно будет установить WeekNumber = 0 после добавления (я бы установил Public, а не частный). И я бы использовал и ObservavleCollection над списком. – Paparazzi

+0

Использование ObservableCollection автоматически уведомляет об изменениях своих элементов (добавление, перемещение, удаление). Кроме того, если вы замените текущий выбранный элемент, ссылка на старую будет потеряна, поэтому индекс будет равен -1. Вы можете использовать небольшую ViewModel для представления этого WeekNumber, и если значение элемента изменяется, изменение является внутренним номером и уведомляет об этом. – JoanComasFdz

ответ

2

Я всегда делаю, что в коде-позади, когда я изменить источник

Например,

Weeks = GetNewWeeksCollection(); 
WeekNumber = 0; 

Альтернативой является использование PropertyChange уведомления

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Weeks") 
     WeekNumber = 0; 
} 

Конечно, это работает только если вы действительно установили Weeks в новую коллекцию. Если вы просто очистить его и восстановить его, вы должны использовать CollectionChanged событие

void Weeks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Reset) 
     WeekNumber = 0; 
} 
+0

Я менял _WeekNumber (частное целое число поддержки WeekNumber), и он не работал, он работает с изменением WeekNumber !!! ??? все еще есть проблема: WeekNumber меняет, скажем, 5 на !! - 1 !! то до 0. и -1 недопустим индекс ... – GameAlchemist

+0

@VincentPiel Закрытая версия свойства, вероятно, не вызывает уведомление PropertyChange, поэтому пользовательский интерфейс не знает, что значение изменилось и оно должно обновиться. И индекс '-1' означает, что элемент не выбран, поэтому он все еще является допустимым значением.Скорее всего, изменение источника сбрасывает 'SelectedIndex', поэтому' ComboBox' отвечает за установку значения '-1', но так как вы установили его в' 0' сразу после того, как вы его не заметили. – Rachel

0

Вы должны использовать триггер:

<ComboBox Name="WeeksComboBox" IsEditable="False" 
            ItemsSource="{Binding Weeks}" 
            SelectedIndex="{Binding WeekNumber}" > 
     <ComboBox.Style> 
      <Style TargetType="{x:Type ComboBox}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=SelectedItemId}" Value="-1"> 
         <Setter Property="SelectedIndex" Value="0"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 

Вы можете определить триггер, как это все выпадающие списки. Google для получения дополнительной информации о стилях и триггерах.

+0

Что происходит, когда недели пусты, а значение = "0" неверно? – Paparazzi

+0

Вы потеряете привязку, если вы это сделаете – Rachel

+0

thx, я предпочитаю изменение в модели. – GameAlchemist

Смежные вопросы