2013-08-07 103 views
1

在MvvmCross綁定對於XAML觀,我有它鉤住this.ViewModel.PropertyChanged像這樣:從視圖中的代碼隱藏

ViewModel.PropertyChanged += (s, e) => 
{ 
    if (e.PropertyName == "CurrentImage") 
     DoStuff(); 
}; 

這是因爲XAML是不夠靈活,我實現我直接喜歡什麼不代碼隱藏,也是因爲它是純粹與WinRT/XAML相關的代碼,而不是核心便攜式項目。

視圖的構造函數的過程

然而,ViewModel屬性爲null,因此它是像這樣工作圍繞:

this.Loaded += (s2, e2) => 
ViewModel.PropertyChanged += (s, e) => 
{ 
    if (e.PropertyName == "CurrentImage") 
     DoStuff(); 
}; 

我想這(除了使用一個字符串,它指一個屬性)可能是不很乾淨,而且可能應該有更好的方法來實現我想要的。有沒有更理想的方法?

回答

3

這可以用MvxPropertyChangedListener來完成,如Stuart's comment提到:

new MvxPropertyChangedListener(ViewModel).Listen<TOfProperty>(
    () => ViewModel.SomeProperty, 
    () => 
    { 
     // Do something 
    }); 
+0

非常感謝此。任何時候,我想綁定一個簡單的屬性更改爲具有複雜的業務影響,需要訪問視圖狀態我做了這樣的事情[對於其他人,iOS上的等效設置。綁定(this).For(ViewProperty).To(nameof (ViewModel.Property)]。 –

2

是的,有一個更好的方法。通常,人們使用約什史密斯的PropertyObserver

雖然這是我第一次聽說過MvvmCross。我開發了自己的跨平臺MVVM框架,其中包含一個類,它履行與Josh Smith的PropertyObserver相同的功能。我想知道MvvmCross是否還沒有類似的東西。

+1

有一個'MvxPropertyChangedListener.cs'輔助類 - 也幾個擴展方法幫手太 - 看到HTTPS來源:// github上。 com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross/ViewModels/MvxPropertyChangedListener.cs - **注意** Mvx屬性更改偵聽器在其實現中使用'WeakReference' - 這對於Xamarin iOS非常重要和Mac平臺(在Windows和Android上仍然有點重要),因爲它有助於防止內存泄漏 – Stuart