在使用MVVM模式时如何在WPF中继承视图?

时间:2012-03-16 16:28:16

标签: c# inheritance mvvm user-controls

我对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中执行类似的操作,以便所有内容都进入第三行?

2 个答案:

答案 0 :(得分:0)

我认为这更像是一组包装控件,每个控件都有一个内容部分。

如果你认为它更像是一个“按钮”,那么你可以得到我的意思。 WPF按钮具有在您的XAML中粘贴<Button>Content</Button>时调用的特定样式和布局。每个按钮还有一个“内容”部分,用于确定呈现指定内容的XAML中的位置。您的通用布局可以构建为“只是一个控件”,就像一个按钮,但内置了常见的功能。

然后,您可以在每个内容中添加您的特定内容。您的控件不需要是它自己的视图,但它肯定可以根据需要包含与关联的ViewModel相关的视图。

因此,您的工具窗格是一个带有VM的视图,其中包含一些“工具”控件,用于常见布局。然后,每个工具都有一个内容部分,其中包含每个工具的特定视图控件。

答案 1 :(得分:0)

从自定义基类继承视图是常见视图逻辑的绝佳解决方案。创建专门的UserControl或创建高级模板以创建要在许多视图上重用的视图对象。然后使UserControls可绑定到视图数据。