2016-12-06 58 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 ...您认为这是一个好的解决方案吗?

相关问题