WPF MVVM视图/用户控件继承或类似的概念?
问题描述:
我正在构建一个WPF应用程序,并使用caliburn.micro for MVVM。 我有几十个视图(UserControls)。WPF MVVM视图/用户控件继承或类似的概念?
视图有标题正文和页脚。 如下图所示,标题包含两个用于粉碎操作的按钮,页脚包含一个状态栏。
页眉和页脚份将是相同的所有视图,但身体的内容会有所不同对视图中查看。 目前我正在为每个视图重复代码的标题和正文,现在我试图消除重复的代码。
为了达到此目的,我正在考虑制定一个共同的基本视图,与所有其他视图共享。
当前实现
<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有点新)。
我的目标是通过继承视图中的一些控件来消除重复代码。
如何将基本视图与子视图组合? 任何人都可以建议我达到我的要求吗? 提供一些代码示例将不胜感激。
答
可以通过嵌套的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,但它使用相同的基本方法。
答
例如,您可以在父窗口中或在您在父窗口的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>
孩子的意见并不知道页眉和页脚什么。
在WPF中不可能继承Views(UserControls),你的页眉和页脚在整个应用程序中是否保持不变? – XAMlMAX
是的它没有改变。只是我想以某种方式将页眉和页脚添加到我的子视图中。 – Rahul