假设有一个枚举
enum SampleEnum
{
Item1,
Item2
}
然后是一个组合框
<ComboBox ItemsSource="{Binding SomeItemSource}"
SelectedItem="{Binding
Path=ItemX,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource ResourceKey=SomeConverter}}">
组合框中有一个ViewModel作为其
DataContext
ViewModel : INotifyPropertyChanged, ...
{
...
public SampleEnum ItemX
{
get => model.GetItemX();
set
{
model.SetItemX(value);
RaisePropertyChanged();
}
}
...
}
和
RaisePropertyChanged([CallerMemberName] string caller = "")
调用
PropertyChanged
使用属性的名称。
但是
.
当我运行代码时,打开
CheckBox
,选择一项,我得到以下行为:我的代码进入setter,设置模型的值,引发PropertyChanged,然后调用我的getter,检索值,
但它从未达到
ComboBox
.
组合框
显示我手动选择的值,而不是访问者返回的值。
E、 g.如果你重写
get => SampleEnum.Item2
要始终返回相同的值,
组合框
即使我百分之百确定调用了getter,但仍然会在UI中显示我亲手挑选的值,而不是访问器返回的值,然后值会传递到转换器,Converter也会返回正确的值。
如果
RaisePropertyChanged(nameof(ItemX))
从任何其他地方调用,
组合框
立即从访问器中检索值并显示它。
简言之
组合框
忽略
房地产变更
如果从setter调用,但在任何其他情况下,它都可以正常工作。直接指定属性的名称(而不是依赖于编译器服务)或在setter中调用行中更改的多个RasiePropertyChanged不起作用。
一般来说,在组合框中选择的值和getter返回的值应该是相同的,但有时模型可以拒绝提供的值,而返回默认值。这不是最好的行为,但这是可能的。在这种情况下,用户将被错误地告知
组合框
实际上已选中。
我只是想知道这个访问器有什么特别之处,以至于ComboBox忽略了它。