2016-02-27 84 views
0

是否有可能以某種方式「鏈接」不同ViewModel的兩個屬性,使得當一個屬性發生更改時,另一個屬性也發生更改。所以實質上,我希望不同ViewModel中的兩個屬性的行爲就像它們一樣。鏈接不同ViewModels中的Xamarin屬性

這將是很好,如果我可以做這樣的事情在我的ViewModels如下:

WhenPropertyChanges(() => SettingX).CopyValueTo(() => ModelView2.SettingX); 

舉例:在我的設置頁面,當我更改設置,我希望新的數值爲處於可用另一個頁面的ViewModel。

我知道我能做到這一點與第三層(模型),但感覺有點笨重,我解決它現在的方式感覺不對(觸發事件)。

我已經從此頁實施了以下MVVM-Pattern:http://www.wintellect.com/devcenter/krome/linking-property-change-notifications-in-xamarin-forms-or-wpfsilverlight。據我瞭解,作者說他的代碼使它成爲可能,但不幸的是他沒有說明如何。

我也發現了這篇文章(http://blog.alectucker.com/post/2014/07/26/using-messageingcenter-in-xamarin-forms-for-viewmodel-to-viewmodel-navigation.aspx),但我不一定要導航到其他視圖。不過,也許我可以用這個MessagingCenter來實現我的目標?

回答

0

這在您引用的我的文章的最後一段中介紹。我用一個簡單的擴展方法來做到這一點。這方面的例子可以從本文的源代碼的例子可以看出,在這個文件中:https://github.com/Wintellect/XamarinSamples/blob/master/PropertyDependencyDemo%2FPropertyDependencyDemo%2FMvvm%2FObservableExtensions.cs

爲了您的具體的例子,它會是這個樣子:

// using PropertyDependencyDemo.Mvvm; 
// ... use the namespace above that contains the ObservableExtensions class 

ModelView1 
    .WhenPropertyChanges((a) => a.SettingX) 
    .AlsoInvokeAction(() => ModelView2.SettingX = ModelView1.SettingX); 

這一切確實是勾成以名稱安全的方式爲您提供源視圖模型的PropertyChanged事件。

但有一點要注意:您需要小心,不要造成無意中阻止垃圾收集的情況。這種情況發生的原因是在這個例子中,ViewModel1現在有一個PropertyChanged處理程序,該處理程序引用一個PropertyDependency對象,由於Action lambda表達式中捕獲到的引用,該對象又引用了ModelView1和ModelView2。

如果你肯定知道,這不會是一個問題(或許都走出去的範圍在一起),那麼就沒有什麼可擔心的。但是如果你發現自己面臨的情況是你需要阻止ModelView1固定ModelView2,那麼你可以使用WeakReference來實現。再次,這不太可能是一個問題,但如果你發現它泄漏內存,那麼你可以改變上面這個:

// assuming "TModelView" is the class name of the viewmodels 

var wr = new WeakReference<TModelView>(ModelView2); 
ModelView1 
    .WhenPropertyChanges((a) => a.SettingX) 
    .AlsoInvokeAction(() => { 
     TModelView mv; 
     if (wr.TryGetTarget(out mv)) 
      mv.SettingX = ModelView1.SettingX; 
    }); 
+0

好吧,我已經試過了。我喜歡它,但我並不完全滿意我訪問其他ViewModels的方式 - 通過構造函數傳遞它們。如何在ModelView1中獲得ModelView2的參考最佳方式? –

+0

屬性更改可以隨時連線 - 它不必位於構造函數中。我通常只是爲了方便而把它們放在那裏。 –

0

我認爲,如果導航是佛甲(你只需要第1頁第2頁的信息),可以使用MessagingCenter做你想做什麼。

如果用戶能夠改變在2頁中的數據(以及在頁面1被更新)的messagingCenter是有點棘手使用。我認爲你可以使用你提供的第一個鏈接。只需在您的ViewModel中使用具有所有共享數據的抽象類。

如果你想要更多的幫助把一個更完整的代碼示例。