10

我知道IObserver是觀察者模式的實現,可以用於類似於.Net事件的情況。IObservable <T>和INotifyPropertyChanged - 有沒有連接

我想知道是否有任何關係INotifyPropertyChanged?

我目前使用INotifyPropertyChanged在Winforms中的數據綁定& WPF應用程序,並想知道我是否能夠在UI數據綁定場景中使用IObservable?

乾杯

AWC

回答

3

除非WinForms和WPF的綁定也支持IObservable,這將不利於跟上模型的變化更新UI。可以使用INotifyPropertyChanged的原因是因爲WinForms和WPF中的綁定代碼查找此接口,並且在實現時使用它的事件來保持UI最新。

+0

謝謝,但不是很有幫助,我知道界面在綁定方面的工作原理 – AwkwardCoder 2010-01-30 13:22:11

+2

@AWC:相反,他的解釋確實解決了您的問題,尤其是您的最後一個問題。 – 2010-02-17 16:44:32

+0

讓我們看看 - 我說我已經使用INotifyPropertyChanged,所以我會對Winforms \ WPF有一些瞭解,我想知道IObservable以及它是否具有Winforms \ WPF中最後一種使用模式題。因此,它不是真的有用... – AwkwardCoder 2010-02-17 17:29:43

5

從我能收集的東西中,沒有任何關係。觀察者/ .NET事件是實現觀察者/通知樣式行爲的兩種方式。

微軟的答案一直是建立在.NET事件模式的基礎之上,並不贊成手動註冊的Observer對象。

我最大的事情之一就是無法按需清除委託鏈,這導致了很多託管內存泄漏的情況。爲此,微軟引入了弱事件的概念,即解決觀察者/觀察者不匹配的時間表問題。

你可以閱讀更多關於WeakEvent模式here

Josh Smith發佈了一個用於INotifyPropertyChanged的WeakEventManager的實現here。這提供了一種更安全的(從內存角度來看)連接改變屬性的對象及其觀察者的方式。

+0

MVVM基金會項目看起來已經死了,2.5年內沒有任何活動 – BlackICE 2012-02-24 15:01:15

1

如果你的意思IObserver /的IObservable由RX擴展定義爲:

http://channel9.msdn.com/shows/Going+Deep/Kim-Hamilton-and-Wes-Dyer-Inside-NET-Rx-and-IObservableIObserver-in-the-BCL-VS-2010/

和:

http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

那麼它像蘋果和桔子。

INotifyPropertyChanged只是爲數據綁定/ etc提供了一個通用事件連接,讓控件知道何時更新其綁定值。

IObservable/IObserver更像是「查詢事件序列」,但即使這樣描述也很差。

嗯......好的,你知道如何將這些東西放入這個稱爲集合的「包」中,然後查詢該集合(手動或使用LINQ語句)以提取值,對吧?有點像這樣,但不是將數據從「包中」拉出來,而是將事件「推」給你。

無恥的插件,可以幫助或進一步迷惑: http://blog.lab49.com/archives/3252

2

首先,我是一個有點新的Rx,所以相應地採取我的意見。

也就是說,我認爲INotifyPropertyChanged和Rx的IObservable之間有很大的合作機會。我認爲目前UI是圍繞INPC構建的,這是相當明顯的。但是,INPC也是檢測變更和管理場景模型或視圖模型在對象和屬性之間具有相互依賴關係的場景的主要方式。正是這些相互依賴關係看起來像是Rx的優秀候選人。

直接使用INPC有點棘手,有點痛苦。大量的魔術字符串來處理。在對象樹的多個層次上觀察對象上的事件也是有點痛苦的。

但是,如果我可以「反應性地」模擬這些交互,那麼我的視圖模型和領域模型開始感覺更加優雅。這在Bindable Linq,Continuous Linq,等項目的優雅中很明顯。這些庫可以很容易地創建「實時值」或「實時集合」,以自動更新(我敢說「被動地」更改)。即使沒有Rx,連續Linq甚至有一個"reactive object" framework來做反應式編程。

在我看來,如果我們可以使用Rx來保持模型和視圖模型的一致性,協同作用就會出現。然後,我們可以通過繼續根據需要提高PropertyChanged來使模型/視圖模型的「可綁定表面」符合INPC。我見過幾個elegant extension methods,它們將從INotifyPropertyChanged創建一個觀察值。看起來另一半可能是創建一些從Rx轉換回INPC的基礎設施。

+0

+1這正是我打算看看的內容。還在研究[ReactiveUI](http://www.reactiveui.net/) – Benjol 2013-05-06 11:26:02