链接来自不同ViewModel的Xamarin属性

时间:2016-02-27 12:23:00

标签: c# xamarin mvvm xamarin.forms viewmodel

是否可以以某种方式“链接”不同ViewModel的两个属性,以便当一个属性更改时,另一个属性也会更改。所以从本质上讲,我希望不同ViewModel中的两个属性就像它们是一个一样。

如果我可以在我的ViewModel中执行以下操作,那就太好了:

WhenPropertyChanges(() => SettingX).CopyValueTo(() => ModelView2.SettingX);

示例:在我的设置页面上,当我更改设置时,我希望新值在另一页的ViewModel中可用。

我知道我可以通过第三层(模型)实现这一点,但感觉有点笨重,而我现在解决它的方式感觉不对(射击事件)。

我在此页面中实现了以下MVVM-Pattern:http://www.wintellect.com/devcenter/krome/linking-property-change-notifications-in-xamarin-forms-or-wpfsilverlight。据我所知,作者说他的代码使它成为可能,但不幸的是他没有表明如何。

我也发现了这篇文章(http://blog.alectucker.com/post/2014/07/26/using-messageingcenter-in-xamarin-forms-for-viewmodel-to-viewmodel-navigation.aspx),但我不一定想要导航到另一个视图。不过,也许我可以以某种方式使用这个MessagingCenter来实现我的目标吗?

2 个答案:

答案 0 :(得分:0)

我认为如果导航是lineare(您只需要第2页第1页的信息),您可以使用MessagingCenter来执行您想要的操作。

如果用户能够更改第2页中的数据(并在第1页中进行更新),则使用messagingCenter会有点棘手。我想你可以使用你提供的第一个链接。只需在ViewModels中使用包含所有共享数据的抽象类。

如果您需要更多帮助,请填写更完整的代码示例。

答案 1 :(得分:0)

您在我的文章的最后一段中提到了这一点。我使用一个简单的扩展方法来做到这一点。可以在本文的源代码示例中看到此示例: https://github.com/Wintellect/XamarinSamples/blob/master/PropertyDependencyDemo%2FPropertyDependencyDemo%2FMvvm%2FObservableExtensions.cs





对于您的具体示例,它看起来像这样:




  //使用PropertyDependencyDemo.Mvvm;
 // ...使用命名空间上面包含ObservableExtensions类

 ModelView1
 .WhenPropertyChanges((a)=> a.SettingX)
 .AlsoInvokeAction(()=> ModelView2.SettingX = ModelView1.SettingX);
  




所有这一切都挂钩到PropertyChanged事件中以一种名称安全的方式为您提供源视图模型。





但需要注意一点:您需要小心不要创建情境你无意中阻止对象被垃圾收集的地方。可能发生这种情况的原因是,在此示例中,ViewModel1现在将具有一个PropertyChanged处理程序,该处理程序引用PropertyDependency对象,而该对象又引用ModelView1和ModelView2,因为Action lambda表达式中捕获了引用。


 


如果您确定这不会是一个问题(可能两者都超出范围),那么没有什么可担心的。但是如果你发现自己面临需要阻止ModelView1保持ModelView2固定的情况,那么你可以使用WeakReference来实现。同样,这不太可能是一个问题,但如果你发现它泄漏了内存,那么你可以将上面改为:




  //假设“TModelView”是viewmodels的类名

 var wr = new WeakReference< TModelView>(ModelView2);
 ModelView1
 .WhenPropertyChanges((a)=> a.SettingX)
 .AlsoInvokeAction(()=> {
 TModelView mv;
 if(wr.TryGetTarget(out mv))
 mv.SettingX = ModelView1.SettingX;
});& #xA;