在这个领域有相当多的帖子,但没有一个帮助我…场景如下:我有两个"季节"下拉菜单来模拟一个范围。如果在开始范围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刷新日历。