【发布时间】:2017-12-01 16:06:58
【问题描述】:
所以假设有一个枚举
enum SampleEnum
{
Item1,
Item2
}
然后有一个ComboBox
<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。 ComboBox 显示的是我手动选择的值,而不是访问器返回的值。
例如如果您重写 get => SampleEnum.Item2 以始终返回相同的值,ComboBox 仍将显示我在 UI 中选择的值,而不是访问器返回的值,即使我 100% 确定调用了 getter,比值传播到 Converter 和 Convrter 也返回正确的值。
但是如果从任何其他地方调用RaisePropertyChanged(nameof(ItemX)),ComboBox 会立即从访问器中检索值并显示它。
简而言之,如果从 setter 调用 ComboBox 会忽略 PropertyChanged,但在任何其他情况下它都可以正常工作。直接指定属性名称(而不是依赖编译器服务)或者在setter中连续调用多个RasiePropertyChanged都不起作用。
一般来说,人们应该期望在组合框中选择的值和 getter 返回的值是相同的,但有时模型可以拒绝提供的值,而是返回一个默认值。不是最好的行为,但它是可能的。在这种情况下,用户将被错误地告知实际选择了 ComboBox 的哪个项目。
我只是想知道这个访问器有什么特别之处以至于 ComboBox 会忽略它。
【问题讨论】:
标签: c# wpf binding propertychanged