2012-08-27 83 views
2

当我们有一个双向绑定视图和视图模型之间的参与,我们实现它具有以下事件INotifyPropertyChanged接口:如何更新视图和视图模型不使用INotifyPropertyChanged的

// Summary: 
//  Occurs when a property value changes. 
event PropertyChangedEventHandler PropertyChanged; 

但我可以做没有实现INotifyPropertyChanged?

+0

“做同样的事情”可以用几种不同的方式来解释。如果你问“我可以添加一个名为PropertyChanged的事件处理程序”,那么是的,你可以! – Patrick

+3

是否有任何特定原因导致您无法使用或不喜欢使用INotifyPropertyChanged? – Clemens

+0

@Clemens我也有这个问题。想想第三方库,你想直接在WPF中显示对象。当然,通常你会将这些对象视为模型,并创建一个视图模型。但是当你使用类似PropertyGrid的东西时,这很难。我有一个物理引擎和一个属性网格的问题。 – dowhilefor

回答

1

如果你想避免明确地实现INotifyPropertyChanged,你可以使用像PostSharp这样的代码编织工具。然后,实施INotifyPropertyChanged变得简单

[NotifyPropertyChanged] 
public class Shape 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

你可以在这里找到更多的细节:http://www.sharpcrafters.com/solutions/notifypropertychanged#

0

我会说不。你必须以任何方式实现INotifyPropertyChanged,否则用twoway绑定将无法工作。

1

你当然可以。当视图模型改变时,您只需简单地松开更新视图的简单方法。现在有办法解决这个问题。

  1. 再涂DataContext,这样所有绑定被重新评估 ,但这是非常昂贵的。
  2. 在UI中,获取所需属性的绑定并调用 UpdateTarget

但显然这些都是非常奇怪的解决方法。它还值得一提的是,绑定到一个没有实现INotifyPropertyChanged的对象通常会比较慢。

2

如果你不能实现INotifyPropertyChanged(INPC)(或者没有你想绑定的源代码),那么你应该在你的视图模型和视图模型中包装任何你想绑定的东西将实现INPC的绑定,并且必须获取/设置数据,大概是其他类。