2011-09-22 80 views
2

我開始在新項目中使用MVVM模式。 一切都很好,但我遇到了以下問題。 實現如下所示: 我有一個MainView,主應用程序窗口。在這個窗口中,我有一個telerik RadGroupPanel,我將其餘的應用視圖作爲標籤進行託管。 視圖模型的其餘部分不知道在MainVIew中託管的RadGroupPanel。 我應該如何正確地將這些視圖從viewModels中的命令添加到RadGroupPanel? 謝謝。MVVM訪問viewmodel中的其他視圖元素

回答

0

在主窗口視圖模型中,您可以在ObservableCollection中擁有需要添加控件的視圖模型列表。然後,您可以將RadGroupPanel的ItemsSource綁定到該集合,並使用RadGroupPanel的ItemTemplateSelector和ContentTemplateSelector根據綁定的視圖模型選擇要使用的正確模板。

1

您是否考慮過使用接口將視圖注入ViewModel以保持分離?我知道這打破了MVVM,但我已經成功地在許多WPF項目中使用了它。我稱之爲MiVVM or Model Interface-to-View ViewModel

該模式很簡單。你的用戶控件應該有一個接口,稱它爲IView。然後在視圖模型,你有型IMyView的二傳手屬性,說

然後在視圖中創建一個名爲依賴屬性這

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的附加屬性實現。

相關問題