【发布时间】:2018-12-13 22:50:25
【问题描述】:
搜索没有给我带来任何线索,我有点不知所措。 到目前为止,WPF 是自学的,所以我可能会忽略一些简单的东西。
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<TextBlock Text={Binding BoundTextProperty}"/>
这是简化的xml
public class MainViewModel
{
private Model Data;
public MainViewModel()
{...}
public string BoundTextProperty => Data.BoundTextProperty;
...
}
绑定的属性引用了模型中保存数据的属性
public class Model : INotifyPropertyChanged
{
private long number;
public long Number
{
get { return number; }
set
{
number = value;
OnPropertyChanged(nameof(BoundTextProperty));
}
}
public string BoundTextProperty => $"Some text {Number} some text again";
public virtual event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我发誓它在某些时候有效。 该字符串还有几个其他变量,但这是它如何工作的基本原理,或者说没有。
我的问题是绑定是否真的可以冒泡,如果可以,为什么不呢?
【问题讨论】:
-
不,它不会自动冒泡,您还必须在
MainViewModel中调用OnPropertyChanged,例如通过处理Data的PropertyChanged事件,例如喜欢Data.PropertyChanged += ... handler that calls OnPropertyChanged ...。 -
默认情况下绝对不会冒泡。我还强烈建议不要用
INotifyPropertyChanged接口混淆你的Model类。您的模型应该与 MVVM / 绑定架构无关。属性更改事件应始终来自您的 ViewModel。 -
要添加另一个意见,在模型类中实现INotifyPropertyChanged 是完全有效的。这样做不会违反 MVVM 模式,尤其不会“弄脏”任何东西。
-
所以模型中根本没有 OnPropertyChanged 调用?编辑:这正是 wpf 令人困惑的原因,因为每个人都以不同的方式这样做
-
我在 Model 和 ViewModel 上都有 INotifyPropertyChangedImplemented,因为某些数据在 viewModel 中比在模型中更有意义
标签: c# wpf binding inotifypropertychanged