MVVM从viewModel访问其他视图的元素

时间:2011-09-22 17:48:41

标签: mvvm

我开始在新项目中使用MVVM模式。 一切都很好,但我遇到了以下问题。 实现如下: 我有一个MainView,主应用程序窗口。在这个窗口中,我有一个telerik RadGroupPanel,我将其余的应用程序视图作为选项卡托管。 viewModel的其余部分不知道在MainVIew中托管的这个RadGroupPanel。 我应该如何从viewModels中的命令正确地将这些视图添加到RadGroupPanel? 感谢。

2 个答案:

答案 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选择要使用的正确模板。