我在VS2015中使用Xamarin.Forms便携解决方案。我使用MVVM Light将PCL中的内容页面绑定到一个ViewModel。如果我现在更改ViewModel中的一个属性,它将更新安卓、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时,必须更新绑定。
因此,我将非常感谢任何如何以一种好的方式组织这一活动的建议。
发布于 2016-12-08 02:35:03
您可以通过为您在内容页面中加载的视图编写自定义渲染器来获得视图模型。例如,您在内容页中加载一个标签。然后,您可以为该标签编写自定义渲染器,并获得视图模型,如下所示:
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;
}
}
}请确保在自定义渲染器类中的命名空间上方添加以下属性。
assembly:ExportRendererAttribute(typeof(Label),类型(CustomRenderer))
然后,您可以访问MainActivity中的ViewModel属性(它只是pcl中的ViewModel ),只需为CustomRenderer类创建一个实例,如下所示:
新渲染器= CustomRenderer CustomRenderer();
renderer.ViewModel.example = "XXX";
我希望这种方式能帮助你!
发布于 2016-12-08 02:50:29
谢谢你的回答。我现在是这样做的:
我在实现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...你认为这是一个好的解决方案吗?
https://stackoverflow.com/questions/41002145
复制相似问题