从Xamarin.Droid中的MainActivity访问PCL ViewModel

时间:2016-12-06 18:15:05

标签: mvvm xamarin

我在VS2015中使用的是Xamarin.Forms Portable解决方案。我使用MVVM Light将PCL中的内容页面绑定到ViewModel。如果我现在在ViewModel中更改我的一个属性,它将更新Android,IOS和UWP上的UI。但是,我不知道如何实现更新ViewModel属性。

在我的droid项目MainActivity中,我正在使用Activity中的继承OnNewIntent注册一个新意图。调用此OnNewIntent后,我想更改ViewModel中的属性,例如public string example。我不能简单地使用

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

然后我创建一个ViewModel的新实例,我的DataBinding引用另一个实例。那么这样做的正确方法是什么?我想过在我的ViewModel属性的getter中使用DependencyInjection,比如

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

但是我还必须通知ViewModel在MainActivity中调用OnNewIntent时必须更新绑定。

所以我非常感谢任何有关如何以良好方式组织这一点的建议。

2 个答案:

答案 0 :(得分:0)

您可以通过为内容页面中加载的视图编写自定义渲染器来获取视图模型。例如,您在内容页面中加载Label。然后,您可以为该标签编写自定义渲染器,并获取视图模型,如下所示

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中的ViewModel),如下所示,

CustomRenderer renderer = new CustomRenderer();

renderer.ViewModel.example =" XXX&#34 ;;

我希望这种方式可以帮助你!!!

答案 1 :(得分:0)

感谢您的回答。我现在这样做了:

我在PCL项目中创建了一个实现public static class MyClass的静态类INotifyPropertyChanged。从我在MainActivity中的OnNewIntent我在public static string example中设置了属性MyClass。在这个属性的setter中,我调用PropertyChanged,它在ViewModel中被注意到。在那里,我使用RaisePropertyChanged("example")并在ViewModel属性example的getter中使用get { return My Class.example; }。所以基本上我只是使用我的ViewModel中的静态模型(或模型中的静态属性,并不需要是静态的),当事情发生变化时,它会通知ViewModel。然后可以从iOS或UWP项目设置相同的属性,并且它们的UI引用相同的ViewModel ......您认为这是一个很好的解决方案吗?