2012-03-16 81 views
3

我對WPF和MVVM模式有點新鮮。這是我的情況。我的應用程序看起來與Outlook(2007)類似。有一個帶有編輯列表的左側導航窗格和編輯器將顯示在標籤中的正確內容窗格。我的一些編輯有一個非常相似的外觀。他們將有一個頂部窗格,其中包含要編輯的項目網格。一旦選擇一個項目,底部窗格將顯示一個帶有文本框,組合框等的窗體式編輯器。我想將這些編輯器的基本功能封裝在一個基類中。但是,從我讀過的內容來看,你不能繼承XAML。我看到有人提到的一個解決方案是創建沒有XAML(僅.cs文件)的基本UserControl類。然後,我編輯器的每個視圖都可以繼承它,幷包含編輯器特定的項目 - 特別是底部的編輯窗格。每個編輯器都有自己的視圖模型,但它們也會從一個普通視圖模型基類繼承而來。這是一個很好的解決方案還是有更好的方法。如何在使用MVVM模式時繼承WPF中的視圖?

編輯:

所以我的下一個問題是如何?我創建了以下基類(不帶XAML),可以動態創建3行。第一行包含DataGrid。基類將定義網格,但子類將設置綁定。第二行只包含一個網格分離器。而第三行是空的。這是特定編輯器將自己的用戶控件放置的位置。

public class BaseEditor : UserControl 
{ 
    public BaseEditor() 
    { 
    RowDefinition gridRow = new RowDefinition(); 
    RowDefinition splitterRow = new RowDefinition(); 
    RowDefinition editorRow = new RowDefinition(); 

    _userControlsGrid.RowDefinitions.Add(gridRow); 
    _userControlsGrid.RowDefinitions.Add(splitterRow); 
    _userControlsGrid.RowDefinitions.Add(editorRow); 

    EditorGrid = new DataGrid(); 
    Grid.SetRow(EditorGrid, 0); 
    _userControlsGrid.Children.Add(EditorGrid); 

    GridSplitter gridSplitter = new GridSplitter(); 
    Grid.SetRow(gridSplitter, 1); 
    _userControlsGrid.Children.Add(gridSplitter); 

    AddChild(_userControlsGrid); 
    } 
} 

然後,我試圖創建一個從BaseEditor繼承的特定編輯器。我已經將cs文件中的基類設置爲BaseEditor,並且我還將xaml中的begin/end標記設置爲BaseEditor。

我看到了特定編輯器設計者中的控件。不過,我很快看到這不是我所期望的。如果我開始在特定編輯器的XAML中添加內容,那麼它不在第三行。所以,我錯過了一些東西。在Windows窗體中,您可以使用屬性創建一個內容區域,設計人員只能編輯該區域。我如何在WPF中做類似的事情,使所有的內容進入第三行?

回答

0

我認爲這更像是一組包裝控件,每個包含一個內容部分。

如果你覺得它更像一個「按鈕」,那麼你可以得到我的意思。 WPF Button具有特定的樣式和佈局,當您在XAML中粘貼<Button>Content</Button>時會調用該樣式和佈局。每個按鈕還有一個內容部分,用於確定您的指定內容在XAML中的渲染位置。您的通用佈局可以構建爲使它像控制按鈕一樣,但內置常見功能。

然後,您可以在每個內容中添加您的特定內容。您的控件不需要是它自己的視圖,但它肯定可以根據需要包含關聯ViewModel的視圖。

因此,您的工具窗格是一個帶有虛擬機的視圖,其中包含一些「工具」控件,用於常見佈局。然後每個工具都有一個內容部分,每個工具的特定視圖控件。

0

從定製基類繼承視圖是常見視圖邏輯的絕佳解決方案。創建專門的UserControls或創建高級模板來創建要在許多視圖上重用的視圖對象。然後將UserControls綁定到視圖數據。