在使用MVVM模式的同时,我该如何继承WPF中的视图?

3
我对WPF和MVVM模式还不是很熟悉。我现在的情况是,我的应用程序与Outlook (2007)类似。左侧有一个导航窗格,其中显示了编辑器列表,右侧则是内容窗格,在其中以选项卡形式显示编辑器。我的一些编辑器看起来非常相似。它们都有一个顶部窗格,其中包含要编辑的项目网格。选择项目后,底部窗格将显示一个表单样式的编辑器,其中包含文本框、组合框等等。我想将这些编辑器的基本功能封装在一个基类中。但是,据我所读,您无法继承XAML。我看到有人提出的一个解决方案是创建没有XAML(只有.cs文件)的基础UserControl类。然后,我的每个编辑器视图都可以从它继承,并融入特定于编辑器的项目,尤其是底部编辑窗格。每个编辑器都将拥有自己的视图模型,但它们也将从一个公共的视图模型基类继承。这是一个好的解决方案吗?还是有更好的方法?
编辑:接下来我的问题是如何做到呢?我已经创建了以下没有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中也将其开始/结束标签设置为BaseEditor。

我可以在特定编辑器的设计器中看到控件。然而,我很快发现这不是我所期望的。如果我开始在特定编辑器的XAML中添加内容,它并不会进入第三行。所以,我似乎漏掉了某些东西。在Windows Forms中,你可以使用属性创建Content区域,并且设计器只能编辑该区域。在WPF中如何做类似的事情,使所有内容都进入第三行呢?

2个回答

0

我会把它看作是一组包装控件,每个控件都有一个内容部分。

如果你把它看作是“按钮”,那么你就能理解我的意思了。WPF按钮具有特定的样式和布局,当你在XAML中添加<Button>Content</Button>时,它会被调用。每个按钮还有一个内容部分,确定了您指定的内容在其XAML中呈现的位置。您可以构建通用布局,使其“只是控件”,就像按钮一样,但具有公共功能。

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接