WPF MVVM轻绑定选择项不改变



在这个领域有相当多的帖子,但没有一个帮助我…场景如下:我有两个"季节"下拉菜单来模拟一个范围。如果在开始范围1中选择一个季节,则viewmodel会自动将绑定到结束范围的属性设置为相同的季节(因此它默认为单个年份而不是范围)。下面是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;
  }
}

我已经验证了终端属性正在改变与调试语句和单元测试,但UI没有改变,当我选择它…不知道发生了什么,我已经从很多不同的角度看了…

您是否从AvailableSeasons收集到SelectedSeason ?如果没有,你有没有实现什么特别的东西来比较季节?

例如,假设您有

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

如果SelectedSeason = new Season();的SelectedItem绑定不会工作,因为new Season();不存在于AvailableSeasons

您需要设置SelectedSeason = AvailableSeasons[x]为SelectedItem工作,因为这使得两个项目完全相同。或者您可以实现一些自定义方法来比较两个季节,看看它们是否相同。通常我只是覆盖正在比较的类的ToString()方法。

尝试从ViewModel触发一个事件来通知UI刷新日历。

最新更新