我开始在新项目中使用MVVM模式。
一切都很好,但我遇到了以下问题。
实现看起来像这样:
我有一个MainView,主应用程序窗口。在此窗口中,我有一个telerik RadGroupPanel,将其余的应用程序 View 作为选项卡托管。
其余的viewModels都不知道MainVIew中托管的RadGroupPanel。
我应该如何从viewModels中的命令正确地将这些 View 添加到RadGroupPanel?
谢谢。
最佳答案
您是否考虑过使用接口(interface)将 View 注入(inject)ViewModel来保持分离?我知道这会破坏MVVM,但是我已经在许多WPF项目中成功使用了它。我称之为 MiVVM or Model Interface-to-View ViewModel 。
模式很简单。您的Usercontrol应该有一个接口(interface),称为IView。然后在ViewModel中,您有一个属性为IMyView类型的setter,例如
public IMyView InjectedView { set { _injectedView = value; } }
然后在 View 中创建一个名为This的依赖项属性
public MyUserControl : IMyView
{
public static readonly DependencyProperty ThisProperty =
DependencyProperty.Register("This", typeof(IMyView), typeof(MyUserControl));
public MyUserControl()
{
SetValue(ThisProperty, this);
}
public IMyView This { get { return GetValue(ThisProperty); } set { /* do nothing */ } }
}
最后在Xaml中,您可以使用绑定(bind)将 View 直接注入(inject)到ViewModel中
<MyUserControl This="{Binding InjectedView, Mode=OneWayToSource}"/>
试试看!我已经使用过这种模式很多次了,您在启动时就获得了注入(inject) View 的接口(interface)。这意味着您可以保持分离(可以像模拟IView一样测试Viewmodel),但是可以避免许多第三方控件中缺乏绑定(bind)支持。另外,它的速度很快。您知道绑定(bind)使用反射吗?
上面的博客链接上有一个演示项目,展示了这种模式。如果您使用第三方控件,我建议您试用MiVVM的Attached Property实现。
关于mvvm - MVVM从viewModel访问其他 View 的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7519171/