WPF MVVM Light - привязка выбранного элемента не меняется - PullRequest
1 голос
/ 15 июля 2011

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

<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;
  }
}

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

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

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

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

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

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

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

1 голос
/ 15 июля 2011

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

...