2011-07-15 4 views
1

Довольно много сообщений в этой области, но никто не помогает мне ... вот сценарий: у меня есть два «сезонных» спуска, чтобы имитировать диапазон. Если вы выбираете сезон в начале диапазона один, viewmodele автоматически устанавливает свойство, привязанное к конечному диапазону, к тому же сезону (поэтому по умолчанию он равен одному году, а не диапазону. Вот что выглядит XAML (удалена часть форматирования для удобства чтения атрибута объявления):WPF MVVM Light - привязка SelectedItem не меняется

<ComboBox ItemsSource="{Binding AvailableSeasons, Mode=OneWay}" 
      SelectedItem="{Binding SelectedBeginRangeSeason, Mode=TwoWay}" 
      ItemTemplate="{DynamicResource SeasonItemShortFormat}" /> 
<ComboBox ItemsSource="{Binding AvailableSeasons, Mode=OneWay}" 
      SelectedItem="{Binding SelectedEndRangeSeason, Mode=TwoWay}" 
      ItemTemplate="{DynamicResource SeasonItemShortFormat}" /> 

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

private Season _selectedBeginRangeSeason; 
private const string SelectedBeginRangeSeasonPropertyName = "SelectedBeginRangeSeason"; 
public Season SelectedBeginRangeSeason { 
    get { return _selectedBeginRangeSeason; } 
    set { 
    if (_selectedBeginRangeSeason != value) { 
     var oldValue = _selectedBeginRangeSeason; 
     _selectedBeginRangeSeason = value; 

     RaisePropertyChanged<Season>(SelectedBeginRangeSeasonPropertyName, oldValue, value, true); 
    } 
    } 
} 

private Season _selectedEndRangeSeason; 
private const string SelectedEndRangeSeasonPropertyName = "SelectedEndRangeSeason"; 
public Season SelectedEndRangeSeason { 
    get { return _selectedEndRangeSeason; } 
    set { 
    if (_selectedEndRangeSeason != value) { 
     Debug.WriteLine("Updating property SelectedEndRangeSeason..."); 

     var oldValue = _selectedEndRangeSeason; 
     _selectedEndRangeSeason = value; 

     Debug.WriteLine("Broadcasting PropertyChanged event for property SelectedEndRangeSeason..."); 
     RaisePropertyChanged<Season>(SelectedEndRangeSeasonPropertyName, oldValue, value, true); 
    } 
    } 
} 

private void UpdateSelectedSeasonSelectors() { 
    // if the end range isn't selected... 
    if (_selectedEndRangeSeason == null) { 
    // automatically select the begin for the end range 
    SelectedEndRangeSeason = _selectedBeginRangeSeason; 
    } 
} 

Я проверял конец свойство изменяется как с заявлениями отладки и юнит-тестов, но пользовательский интерфейс не меняется, когда я его выбираю ... не могу понять, что происходит, и посмотрел на это так много разных способов ...

+0

[Этот вопрос] (http://stackoverflow.com/questions/1605939/wpf-combobox-selecteditem-not-updating) звучит похоже на ваш. Вы попробовали ответ на этот вопрос? – RMart

ответ

1

Попробуйте запустить событие из ViewModel, чтобы уведомить пользовательский интерфейс, чтобы обновить календарь.

2

Вы получили SelectedSeason от AvailableSeasons? Если нет, вы реализовали что-нибудь особенное для сравнения Seasons?

Например, предположим, что у вас есть

<ComboBox ItemsSource="{Binding AvailableSeasons}" 
      SelectedItem="{Binding SelectedSeason}" /> 

Если SelectedSeason = new Season(); SelectedItem привязки не будет работать, потому что new Season(); не существует в AvailableSeasons.

Для работы SelectedItem вам необходимо установить SelectedSeason = AvailableSeasons[x], потому что это делает два элемента одинаковыми. Или вы можете реализовать какой-то пользовательский метод для сравнения двух сезонов, чтобы убедиться, что они одинаковые. Обычно я просто перезаписываю метод ToString() сравниваемого класса.

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