簡體   English   中英

在使用MVVM模式時如何在WPF中繼承視圖?

[英]How do I inherit views in WPF while using MVVM pattern?

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

編輯:

所以我的下一個問題是如何? 我創建了以下基類(沒有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中執行類似的操作,以便所有內容都進入第三行?

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

如果你認為它更像是一個“按鈕”,那么你可以得到我的意思。 WPF按鈕具有特定的樣式和布局,當您在XAML中粘貼<Button>Content</Button>時會調用該樣式和布局。 每個按鈕還有一個“內容”部分,用於確定呈現指定內容的XAML中的位置。 您可以構建通用布局,使其“只是一個控件”,就像一個按鈕,但內置了常見的功能。

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

因此,您的工具窗格是一個帶有VM的視圖,其中包含一些“工具”控件,用於常見布局。 然后,每個工具都有一個內容部分,其中包含每個工具的特定視圖控件。

從自定義基類繼承視圖是常見視圖邏輯的一個很好的解決方案。 創建專門的UserControl或創建高級模板以創建要在許多視圖上重用的視圖對象。 然后使UserControls可綁定到視圖數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM