我喜欢没有任何MVVM框架(MVVMLight等)的纯c#/ XAML解决方案.
解决方法
techniques and patterns when it comes to passing data between
application pages
如果数据传递是事件驱动的(即:您希望在收到从服务器推送的数据时通知),请使用弱事件. Prism的EventAggregator是许多实现之一.
如果数据传递是不变的,那么DataContext就会向下流过XAML树,只需使用绑定.
这意味着如果你有一个“主”UserControl使用其他更具体的UserControls,不要设置他们的DataContext,他们将继承主人和一切都很好.
如果要分离功能,请在主视图模型中使用组合.
where to init viewmodels
纯粹主义者会告诉你直接在XAML中实例化它们.我几乎从来没有这样做.
首先,viewmodels通常需要服务,它们作为构造函数参数传递,或者通过MEF在构造函数中注入…等等.所以你不能有一个无参数的构造函数,或者更难.
现在,我们可以做好事情,但是有什么好处呢?让视图的代码隐藏获取viewmodel,或者将其注入到其构造函数中是非常好的.
where to store common application data (shared between multiple
viewmodels)
如果数据是全局的:使用静态类/属性,
在XAML中,您可以通过{x:Static my:StaticClass.StaticProperty}访问它们,如果要达到嵌套类/枚举,则使用而不是.
如果数据仅在多个viewmodel之间共享但不是全部,则在视图模型上使用继承/合成以及控制器模式.
从经验汇总的其他提示:
>只限制你所需要的:当你只需要一个字符串时,不要绑定到整个对象.
>如果你一再绑定相同的东西,不要犹豫,通过继承自Binding / MultiBinding进行自定义标记.它是DRY 101,但大多数人只是复制/粘贴绑定由于某些原因.
例:
public class VisibilityBinding : MultiBinding,IMultiValueConverter { public VisibilityBinding() { var isSomething = new Binding("IsSomething"); isSomething.ElementName = myUsrCtrl; this.Bindings.Add(isSomething); //Add more bindings this.Converter = this; } //Implement IMultiValueConverter to compute a System.Visibility from the bound values. }
而在XAML:
<TextBox Visibility={customMrkup:VisibilityBinding} />
>尽量避免任何数据重复,一直到DAL.同步可以通过I(Multi)ValueConverter推导出的字段变得复杂得非常快.
示例:您有一个音频文件.它具有开始时间,结束时间和持续时间.摆脱这3个属性中的任何一个,第三个可以推断出来.
如果我想到任何更多的技巧,我会回来添加它们.
希望这可以帮助!