在 WPF 中的另一个数据模板中使用一个数据模板

2024-01-06

我有两个数据模板,其中一个是另一个的子集,如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:igEditors="http://infragistics.com/Editors"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:Client.UI.WPF;assembly=Client.UI.WPF"
xmlns:d="http://schemas.microsoft.com/expression/blend/2006"
>
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Client.Resources.WPF.Styles;Component/Styles/CommonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<DataTemplate x:Key="XYZDataTemplate">
    <Grid x:Name="_rootGrid" DataContext="{Binding DataContext}" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
                    <controls:ValueDisplay Grid.Row="0" Grid.Column="0" LabelText="Build number" x:Name="buildNumber" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
                                   Margin="5,10,0,0">
            <igEditors:XamTextEditor  />
        </controls:ValueDisplay>
        <controls:ValueDisplay  Grid.Row="0" Grid.Column="1" LabelText="Tool version" x:Name="toolVersion" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
                                    Margin="20,10,0,0">
            <igEditors:XamTextEditor IsReadOnly="True"/>
        </controls:ValueDisplay>
               </Grid>

</DataTemplate>

另一个如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:igEditors="http://infragistics.com/Editors"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:BHI.ULSS.Client.UI.WPF;assembly=ULSS.Client.UI.WPF"
xmlns:d="http://schemas.microsoft.com/expression/blend/2006"
>


<DataTemplate x:Key="ABCDataTemplate" >
    <Grid x:Name="_rootGrid" DataContext="{Binding DataContext}" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <controls:ValueDisplay Grid.Row="0" Grid.Column="0" LabelText="Build number" x:Name="buildNumber" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
                                   Margin="5,10,0,0">
            <igEditors:XamTextEditor  />
        </controls:ValueDisplay>
        <controls:ValueDisplay  Grid.Row="0" Grid.Column="1" LabelText="Tool version" x:Name="toolVersion" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
                                    Margin="20,10,0,0">
            <igEditors:XamTextEditor IsReadOnly="True"/>
        </controls:ValueDisplay>
        <controls:ValueDisplay Grid.Row="0" Grid.Column="2" LabelText="Size" ShowUnit="True" x:Name="size" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
                                   Margin="20,10,0,0">
            <igEditors:XamTextEditor/>
        </controls:ValueDisplay>
               </Grid>

</DataTemplate>

XYZDataTemplate 是 ABCDataTemplate 的子集,因为两个数据模板中的前两个字段是通用的,所以我想知道是否可以将 ABCDataTemplate 中的冗余代码替换为 XYZDataTemplate 中的冗余代码以提高代码可维护性?谁能建议这是否是正确的方法,如果是的话我该如何实现?

提前致谢, 索米亚


如果您有 XAML 中的样板,您可以使用ContenPresenter作为一种“宏”,可以在多个地方扩展您的样板。首先你定义一个DataTemplate然后你使用ContentPresenter使用资源键“展开”宏。这是一个例子:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="boilerplate">
            <StackPanel Orientation="Horizontal">
                <Rectangle Width="100" Height="100" Stroke="Black" Fill="{Binding}"/>
                <Rectangle Width="100" Height="100" Stroke="Black" Fill="{Binding}"/>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>
    <StackPanel>
        <ContentPresenter ContentTemplate="{StaticResource boilerplate}" Content="Red"/>
        <ContentPresenter ContentTemplate="{StaticResource boilerplate}" Content="Blue"/>
    </StackPanel>
</Grid>

由于模板是真正的模板,因此您可以使用数据绑定。把它想象成一个ItemsControl仅包含一件物品。如果没有绑定,您可以省略Content财产。您可以将其视为宏“参数”。

过度使用它会使您的 XAML 更难以阅读,并且它的性能成本适中,因此请小心使用它。最后,存在一些限制,即“宏”始终扩展为一个顶级元素,因此您无法将两个元素添加到单个元素中Panel一次性使用ContentPresenter.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WPF 中的另一个数据模板中使用一个数据模板 的相关文章

  • 用于添加新实体的 MVVM WPF ViewModel

    我对 WPF 中的 MVVM 的概念是 我们为应用程序中的每个模型都有一个 ViewModel 这意味着如果我们有 Customer 类 实体 那么我们将有 CustomerViewModel CustomerViewModel 将具有代表
  • Prism 7. 将 PrismApplication.CreateShell() 与非 Window 控件一起使用

    我想从 6 3 更新到 7 我似乎遇到了障碍 在 App xaml 中使用 PrismApplication 类时 CreateShell 期望返回类型为 Window 而不是之前需要 DependencyObject 的 BootStra
  • 给一个窗口句柄(Native),如何使用C#关闭窗口?

    给定一个窗口句柄 如何使用该窗口句柄关闭该窗口 最简单的方法是使用 PInvoke 并执行SendMessage with WM CLOSE DllImport user32 dll CharSet CharSet Auto private
  • 如何在 XAML/WPF 中存储和检索多个形状?

    使用 XAML WPF 做一些简单的事情似乎遇到了很多问题 我已经使用矩形和椭圆形等形状创建了一些基于 XAML 的图像来创建我需要应用程序的其他部分使用的图标 但我不能似乎找到了如何做到这一点 我似乎能够在资源字典中存储画布 但无法在任何
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 是否可以“缩放”WPF RichTextBox 中的文本?

    我注意到 WinForms RichTextBox 有一个ZoomFactor我认为这正是我想要的属性 不幸的是 WPF 变体似乎完全缺少此属性 有什么方法可以实现相同的功能 增加 减少整个文档的可见文本大小而不实际更改底层 RTF Upd
  • 为什么 XAML 动画的属性值需要用圆括号括起来?

    这已经困扰我很长时间了 我似乎找不到一个好的解释 此标记中圆括号的用途是什么 它是转换的 XAML 快捷方式吗 为什么它似乎只用于动画 Storyboard TargetProperty TextBlock RenderTransform
  • 为什么Windows 7无法加载程序集PresentationFramework.Aero2?

    我最近完成了我使用 Windows 8 开发的第一个 WPF 应用程序 它在我的机器上运行良好 我的一个朋友也在他的 Windows 8 机器上的 Visual Studio 中运行了它 并且成功了 我在我的机器上使用单击一次安装该程序 它
  • 使用自定义视觉效果创建无边框窗户

    我想使用 WPF 创建一个看起来不像常规窗口的自定义窗口 我想要创建的窗口类似于MacOs窗口 标题居中 带有阴影效果 控件按钮位于窗口左侧 我确实创建了一个无边框窗口 但我有一些问题 1 如何在 XAML 中设置最大化 最小化和关闭按钮的
  • WPF 自定义控件构造、触发器和事件

    我想构建一个新的自定义控件 我发现很少有教程可以给我一些如何实现这一目标的线索 据我了解 创建新的自定义控件总是通过扩展当前控件来完成 甚至可以扩展 例如 从层次结构的非常基本的级别进行控制 您甚至可以扩展 用户界面元素 框架元素 Cont
  • WPF 中可选择的 TextBlock 或带有格式化文本的 TextBox

    我遇到一种情况 我需要显示格式化文本 正常 粗体 突出显示 并且还应该是可选择的 以便用户可以复制文本 我使用了文本块 我可以使用内联内容流元素应用多种格式 但不幸的是它的文本不可选择 虽然文本框允许选择文本并复制到剪贴板 但它不允许我设置
  • 如何将 CefSharp 浏览器限制为给定域

    我想阻止我的应用程序显示特定域 即 example com 以外的网页 我最初的想法是检查请求 URL浏览前开启事件处理程序 public bool OnBeforeBrowse IWebBrowser browser IRequest r
  • 如何在运行时动态更改 DataGrid String 列格式?

    我的 WPF 桌面应用程序提供了一个 UI 来搜索人员并在 DataGrid 中显示结果 此外 用户可以在运行时更改语言 Current UI Culture XAML 中的 DataGrid 定义是
  • WPF:按钮单击+双击问题

    我必须处理 WPF 应用程序中按钮的单击和双击 并具有不同的反应 不幸的是 在双击时 WPF 会触发两个单击事件和一个双击事件 因此很难处理这种情况 它试图使用计时器来解决它 但没有成功 我希望你能帮助我 我们看一下代码 private v
  • 隐形打开的弹出窗口

    第二天就解决这个问题 要重现 请创建新的 WPF 应用程序 xaml
  • 从程序集中加载 ResourceDictionary

    我在文件系统的某个地方有一个程序集 例如 C temp test dll 在该程序集中有一个 ResourceDictionary 例如 abc xaml 我怎样才能获得该资源字典 也许有一种使用反射的方法 到目前为止我还没有找到解决方案
  • 如何引用 dotNet Core 项目?

    我想将 dotNet Core 项目引用到 WPF 项目 我的 WPF 项目使用 v4 6 2 dotNet Framework 我的 dotNet Core 项目使用 v1 6 dotNet Standard 当我尝试引用它时 出现此错误
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 如何使WPF TreeView风格成为WinForms TreeView?

    WPF 默认的 TreeView 非常好 我仍然希望它有连接每个子元素的线 就像 Windows 窗体 TreeView 一样 我在网上搜索了一些例子 但设计得不够好 我怎样才能用WPF实现它 让我回答我自己的问题 Code 您需要做的只是

随机推荐