【问题标题】:Access PCL ViewModel from MainActivity in Xamarin.Droid从 Xamarin.Droid 中的 MainActivity 访问 PCL ViewModel
【发布时间】:2016-12-08 03:26:23
【问题描述】:

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

在我的机器人项目 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 时必须更新绑定。

所以我会非常感谢任何建议如何以一种好的方式组织这个。

【问题讨论】:

    标签: mvvm xamarin


    【解决方案1】:

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

    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(Label),typeof(CustomRenderer))]

    然后,您只需为 CustomRenderer 类创建一个实例,如下所示,即可在 MainActivity 中访问该 ViewModel 属性(除了 pcl 中的 ViewModel),

    CustomRenderer 渲染器 = new CustomRenderer();

    renderer.ViewModel.example = "XXX";

    希望这个方法对你有帮助!!!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        相关资源
        最近更新 更多