2017-06-13 101 views
2

我正在构建一个WPF应用程序,并使用caliburn.micro for MVVM。 我有几十个视图(UserControls)。WPF MVVM视图/用户控件继承或类似的概念?

视图有标题正文和页脚。 如下图所示,标题包含两个用于粉碎操作的按钮,页脚包含一个状态栏。

Sample View

页眉和页脚份将是相同的所有视图,但身体的内容会有所不同对视图中查看。 目前我正在为每个视图重复代码的标题和正文,现在我试图消除重复的代码。

为了达到此目的,我正在考虑制定一个共同的基本视图,与所有其他视图共享。

当前实现

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Grid Name="Header/>" 
     <Grid Name="Body/>" 
     <Grid Name="Footer/>" 
    </StackPanel> 
</UserControl> 

试图acheive像

基础视角

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Grid Name="Header/>" 
     <!-- {Placeholder for child view} --> 
     <Grid Name="Footer/>" 
    </StackPanel> 
</UserControl> 

ChildView

<Grid Name="Body"/> 

可能是我的方法是错误的(我对WPF有点新)。

我的目标是通过继承视图中的一些控件来消除重复代码。

如何将基本视图与子视图组合? 任何人都可以建议我达到我的要求吗? 提供一些代码示例将不胜感激。

+0

在WPF中不可能继承Views(UserControls),你的页眉和页脚在整个应用程序中是否保持不变? – XAMlMAX

+0

是的它没有改变。只是我想以某种方式将页眉和页脚添加到我的子视图中。 – Rahul

回答

0

可以通过嵌套的UserControl就像你一样可以嵌套任何其他元素,所以你可以做这样的事情

<UserControl x:Name="HeaderControl"> 
    <UserControl x:Name="ChildControl"/> 
</UserControl> 

然后你会使用一个DependencyProperty在你的头控制你的孩子控制与之相关联像这样

public UserControl ChildControl 
{ 
    get { return (UserControl)GetValue(ChildControlProperty); } 
    set { SetValue(ChildControlProperty, value); } 
} 

public static readonly DependencyProperty ChildControlProperty = 
    DependencyProperty.Register("Text", typeof(UserControl), typeof(UserControl), new PropertyMetadata(null)); 

This文章给出了一个很好的概述 - 我知道它说的Silverlight,但它使用相同的基本方法。

1

例如,您可以在父窗口中或在您在父窗口的XAML标记中创建的两个单独的用户控件中定义公用页眉和页脚,然后将子视图注入到使用ContentControl,如:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="300" Width="300"> 
    <StackPanel> 

     <local:HeaderUserControl /> 
     <ContentControl Content="{Binding CurrentViewModel}"> 
      <ContentControl.Resources> 
       <DataTemplate DataType="{x:Type local:ViewModelA}"> 
        <local:ViewA /> 
       </DataTemplate> 
       <DataTemplate DataType="{x:Type local:ViewModelB}"> 
        <local:ViewB /> 
       </DataTemplate> 
      </ContentControl.Resources> 
     </ContentControl> 
     <local:FooterUserControl /> 

    </StackPanel> 
</Window> 

孩子的意见并不知道页眉和页脚什么。