WPF MVVM 视图/用户控件继承或类似概念?

3

我正在构建一个WPF应用程序,使用caliburn.micro来实现MVVM模式。

我有数十个视图(UserControls)。

这些视图都有页眉、主体和页脚。如下图所示,页眉包含两个按钮用于CRUD操作,页脚包含状态栏。

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>

尝试实现像这样的东西:
基础视图
<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有点陌生)。我的目标是通过将某些控件继承到视图中来消除重复代码。如何将基础视图与子视图组合?有谁能给我建议以实现我的需求?提供一些代码示例将不胜感激。

WPF中,视图(用户控件)的继承是不可能的,您的应用程序中的标题和页脚是否始终保持不变? - XAMlMAX
是的,它没有改变。我只是想以某种方式将页眉和页脚添加到我的子视图中。 - Rahul
2个回答

2

例如,您可以在父窗口中定义公共标题和页脚,或者在父窗口的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>

孩子视图不知道页眉和页脚的存在。

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));

这篇文章提供了一个很好的概述 - 我知道它说的是Silverlight,但它使用了相同的基本方法。


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