我有一个具有复杂属性类型的ViewModel,并希望将我的视图绑定到此对象的嵌套属性 .
我的ViewModel正在实现 INotifyPropertyChanged
(或者正在实现它_981764_) . 父属性的类未实现 INotifyPropertyChanged
.
当我更新父属性的值时,嵌套属性不会更新 . 你能告诉我如何实现这个功能吗?
视图模型
public class ViewModel : BaseViewModel
{
private Car _myCarProperty;
public Car MyCarProperty
{
get { return _myCarProperty; }
set
{
if (value == _myCarProperty) return;
_myCarProperty = value;
OnPropertyChanged();
}
}
}
在视图中绑定
<TextBlock Text="{Binding Path=MyCarProperty.Manufacturer}" />
当我更改 MyCarProperty
的值时,View不会更新 .
谢谢你的帮助!
编辑:OnPropertyChanged()实现
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion INotifyPropertyChanged
3 回答
我不是WPF专家,但我认为这是因为你选择了错误的道路 .
更新:
“Car类没有实现INotifyPropertyChanged . 但是我没有更改属性Manufacturer,我更改了MyCarProperty属性,所以我希望OnNotifyPropertyChanged事件会触发值更新?”
不,它不会触发值更新级别 . 绑定不会监听整个路径的属性更改,它们只监听它们绑定的对象 .
我在头顶看到了几个选项(当我遇到这个时,按照我的偏好顺序):
绑定到汽车,而不是子属性,并创建一个data template,显示您想要的内容 .
在需要时通过调用UpdateTarget BindingExpression来手动踢绑定 .
我知道在数据模板路线上看起来还有很多东西需要学习,但我保证,与在WPF中工作更多时手动踢绑定相比,数据模板将证明更强大,可扩展,可维护且更有用 . (另外,一旦你了解它们,我认为它们实际上比手动踢绑定更少) .
祝好运!
接受的答案解释了如何处理绑定源上的 sub-property 已更改并且您希望更新视图的情况 - 这不是问题所在 . 事实上,只要您通知在指定路径中更改的任何属性的更改,WPF就会响应来自多个级别的更改 .
至于这个:
WPF已经处理过了 .
在您的示例中,
ViewModel
是绑定源 . 当您设置MyCarProperty
(触发NotifyPropertyChanged
事件)时,WPF将使用 new Binding Source对象的绑定路径重新评估绑定目标值 - 使用新的Manufacturer
更新您的视图 .我用一个简单的WPF应用测试了它 - 它也适用于非常深层嵌套的路径:
https://pastebin.com/K2Ct4F0F