繁体   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