是否可以以某种方式“链接”不同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来实现我的目标吗?
答案 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; 代码>