2012-03-16 79 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绑定到视图数据。