2016-12-29 42 views
1

這是關於如何構造MVVM/WPF應用程序的「最佳實踐設計」問題。WPF/MVVM選項卡式設計和避免綁定錯誤

設想一些像Photoshop,你有一個編輯器,可以打開多個(標籤式)文件&工具箱。每個工具只需設置當前活動文檔的屬性(如打開設置過濾器參數的過濾器&)。我爲標籤界面使用Actipro的Docking & MDI框架。

有兩種類型的文檔支持:調用它們DocSimple & DocComplex,其中DocComplex提供DocSimple的所有可控屬性以及一些附加的屬性。

我所做的現在:

  • MainWindow.xaml & MainWindowViewModel的整體應用(包括對接容器&工具箱/工具控制)
  • MainWindowViewModel有ActiveDocViewModel屬性,該屬性點添加到當前處於活動狀態的文檔選項卡的DocSimpleViewModel或DocComplexViewModel實例(如果沒有打開文檔選項卡,則爲「null」)。
  • MainWindow工具箱中的各種控件綁定到ActiveDocViewModel的各種屬性(即{Binding Path = ActiveDocViewModel.SomeProperty})。

問題1:一般來說,這看起來是否合理?這是我的第一個MVVM應用程序(來自WinForms),&雖然一切工作正常,但我對是否建議綁定到ActiveDocViewModel.Prop有一些疑問......但它似乎也是最合乎邏輯的方法,基於事實上有一個「MainWindow」需要綁定到「多個可能的」doc選項卡之一。

問題2:如上所述,DocComplex提供比DocSimple更多的屬性/選項。我已經從DocSimpleViewModel,&繼承DocComplexViewModel創造MainWindowViewModel財產處理這個喜歡:

public bool IsComplexToolsVisible 
{ 
    get 
    { 
     return(ActiveDocViewModel != null && ActiveDocViewModel is DocComplexViewModel); 
    } 
} 

這必將對工具箱的那一段的「能見度」。再次,它按預期工作 - 但它也會產生「複雜工具」部分中每個屬性的「BindingExpression路徑錯誤:'xxx'屬性未找到」錯誤,只要我們打開DocSimple即可。通過向DocSimple添加'stub'屬性可以很容易地解決這些問題,但是這顯然是錯誤的(當我最終結束時,使用繼承將「複雜」功能添加到「簡單」基本類型的意義何在?無論如何,爲基礎類中的所有東西添加存根?)。所以這些綁定錯誤的存在使我懷疑這種方法是否存在缺陷 - 以及我如何處理複雜vs簡單的情況,同時避免所有綁定錯誤。

任何見解將不勝感激:)

回答

1

首先,一般的結構看起來在我看來很不錯,但我不是專家,沒有想爲這樣的事情。


那麼對你問題的綁定錯誤: 你可以使用一個TemplateSelector,這給出了一個模板,以「簡單的工具箱」爲DocSimple類型和不同的模板,它包含了簡單的工具箱中加上附加DocComplex的部件。

+0

完美!工作就像一個魅力,感謝指針:) – Metal450

相關問題