2016-12-06 60 views
0

我在VS2015中使用Xamarin.Forms便攜式解決方案。我使用MVVM Light將PCL中的內容頁綁定到ViewModel。如果我現在更改ViewModel中的一個屬性,它將更新Android,IOS和UWP上的UI。但是,我卡在一個點,我不知道如何實現更新ViewModel屬性。從MainActivity訪問Xamarin.DPC中的PCL ViewModel

在我的機器人項目MainActivity中,我正在註冊一個新的intent,使用Activity中繼承的OnNewIntent。只要這個OnNewIntent被調用,我想改變ViewModel的屬性,例如public string example。使用

ViewModel vm = new ViewModel(); 
vm.example = "Hi from Android"; 

我再創建視圖模型的新實例和數據綁定我是引用另一個例子中,我不能簡單地做到這一點。那麼做這件事的正確方法是什麼?我想到了我的視圖模型性能的吸氣器使用DependencyInjection,像

public string example 
{get {%using dependency injection here to get the string from Android }} 

但是,我也必須通知視圖模型的結合時OnNewIntent被稱爲在MainActivity已被更新。

所以我會非常感謝任何建議如何以良好的方式進行組織。

回答

0

您可以通過爲已加載到內容頁面的視圖編寫自定義渲染器來獲取視圖模型。例如,您在內容頁面中加載標籤。然後,你可以寫該標籤的自定義渲染和獲取視圖模型,如下圖所示,

class CustomRenderer : LabelRenderer 
{ 
    public ViewModel ViewModel { get; set; } 
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 

     var label = sender as Label; 
     if (label != null) 
     { 
      ContentPage page = label.Parent as ContentPage; 
      ViewModel = page.BindingContext as ViewModel; 
     } 
    } 
} 

請確保添加自定義渲染器類的命名空間上面下面的屬性,

[裝配:ExportRendererAttribute (typeof運算(標籤)的typeof(CustomRenderer))]

然後你就可以通過只創建一個實例CustomRenderer類像下面MainActivity訪問該視圖模型屬性(這是什麼,但在ViewModel在PCL),

CustomRenderer renderer = new CustomRenderer();

renderer.ViewModel.example =「XXX」;

我希望這種方式能幫助你!

0

感謝您的回答。我現在這樣做了:

我在PCL項目中創建了一個靜態類public static class MyClass,它實現了INotifyPropertyChanged。從MainActivity的我的OnNewIntent我設置public static string example屬性MyClass。在這個屬性的setter中,我調用了在ViewModel中注意到的PropertyChanged。在那裏,我使用RaisePropertyChanged("example")並在ViewModel屬性example的吸氣劑中使用了get { return My Class.example; }。所以基本上我只是簡單地使用我的ViewModel中的靜態模型(或我的模型中的靜態屬性,並不需要是靜態本身),它在出現變化時通知ViewModel。然後可以從iOS或UWP項目中設置相同的屬性,並且它們的UI引用同一個ViewModel ...您認爲這是一個好的解決方案嗎?

相關問題