2012-08-27 80 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的綁定,並且必須獲取/設置數據,大概是其他類。