我开始在新项目中使用MVVM模式。 一切都很好,但我遇到了以下问题。 实现如下: 我有一个MainView,主应用程序窗口。在这个窗口中,我有一个telerik RadGroupPanel,我将其余的应用程序视图作为选项卡托管。 viewModel的其余部分不知道在MainVIew中托管的这个RadGroupPanel。 我应该如何从viewModels中的命令正确地将这些视图添加到RadGroupPanel? 感谢。
答案 0 :(得分:1)
您是否考虑过使用界面将视图注入ViewModel以保持分离?我知道这打破了MVVM,但我已成功地在许多WPF项目中使用它。我称之为 MiVVM or Model Interface-to-View ViewModel 。
模式很简单。您的Usercontrol应该有一个接口,称之为IView。然后在ViewModel中你有一个属性为IMyView的setter,比如说
public IMyView InjectedView { set { _injectedView = value; } }
然后在视图中创建一个名为 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中,您可以使用绑定
将视图直接注入ViewModel<MyUserControl This="{Binding InjectedView, Mode=OneWayToSource}"/>
试一试!我已多次使用此模式,并且您在启动时获得了一次注入视图的界面。这意味着你保持分离(Viewmodel可以被测试,因为IView可以被模拟),但是你可以避免在许多第三方控件中缺乏绑定支持。另外,它的速度很快。你知道绑定使用反射吗?
有一个演示项目在上面的博客链接上展示了这种模式。如果您使用第三方控件,我主张尝试MiVVM的附加属性实现。
答案 1 :(得分:0)
您可以在主窗口视图模型的ObservableCollection中添加需要添加控件的视图模型列表。然后,您可以将RadGroupPanel的ItemsSource绑定到该集合,并使用RadGroupPanel的ItemTemplateSelector和ContentTemplateSelector根据绑定的viewmodel选择要使用的正确模板。