gpt4 book ai didi

c# - 如何将面向数据类型的 DataTemplate 与 GridView 一起使用?

转载 作者:行者123 更新时间:2023-11-30 19:44:23 28 4
gpt4 key购买 nike

回答之前:这个问题是关于 WPF 的 ListView 控件(带有 GridView)。它不是关于 WPF 的 DataGrid 控件、ASP.NET 的 DataGridListView 控件,或 WinForm 的 DataGridView ListView 控件。它们听起来都非常相似并且经常混淆,但是错误类型的控制的答案对我来说既没有帮助,更重要的是浪费你写答案的时间,我认为不应该浪费时间。


我有一个带有 GridViewListView 控件,它有几个列绑定(bind)到我的 View 模型的属性。通过指定 CellTemplate(内联或通过资源),我可以轻松自定义 GridViewColumn 单元格的视觉外观。

现在我的 View 模型上有一个特定的属性;它的类型是一个抽象基类,它的值可以是几种派生类型之一。每个派生类型在单元格中都应该有一个不同的 DataTemplate。幸运的是,GridViewColumn 有一个 CellTemplateSelector,它完全符合我的要求,但需要编写一些管道代码。但是查看 DataTemplateSelector 的页面它说:

Note that if you have objects of different types you can set the DataType property on the DataTemplate. If you do that then there is no need to create a DataTemplateSelector. [...] For more information, see Data Templating Overview.

欢呼吧!无需编写管道代码。我的类型不同,所以这看起来很合适。但是,唉,即使在我定义了一个 DataTemplate 之后,它的 DataType 匹配数据绑定(bind)列之一的特定派生类型(使用 GridViewColumn 绑定(bind)) s DisplayMemberBinding), 它没有效果。

我只是想根据 GridView 中某个列的运行时类型显示不同的 DataTemplateDataType 是否以 DataTemplates 为目标与 GridView 不兼容?有没有办法使用它们,或者我必须求助于指定 CellTemplateSelector?也许有一种方法可以在 GridViewColumnCellTemplate 中指定多个 DataTemplate,这样 DataType 属性就会有影响吗?

最佳答案

WPF 允许您插入对象,例如 ViewModels在逻辑树中,同时 DataTemplate可用于告诉WPF在绘制Visual Tree时如何绘制指定的对象。

隐式 DataTemplateDataTemplate只有一个DataType已定义(无 x:Key ),每当 WPF 尝试在 VisualTree 中呈现指定类型的对象时,都会自动使用它。

所以,你可以使用

<Window.Resources>

<DataTemplate DataType="{x:Type local:ViewModelA}">
<local:ViewA />
</DataTemplate>

<DataTemplate DataType="{x:Type local:ViewModelB}">
<local:ViewB />
</DataTemplate>

<DataTemplate DataType="{x:Type local:ViewModelC}">
<local:ViewC />
</DataTemplate>

</Window.Resources>

告诉 WPF 用 ViewA 绘制 ViewModelA,用 ViewB 绘制 ViewModelB,用 ViewC 绘制 ViewModelC。

如果您只想将其应用于您的 GridView 而不是整个窗口,您可以指定 <GridView.Resources> (或者 <ListView.Resources> ,我不记得是哪个了)

应该注意的是,如果您使用 DisplayMemberBinding 绑定(bind)您的列,它将呈现为 TextBoxText绑定(bind)到您的属性的值,这意味着它将呈现 YourViewModel.ToString()而不是尝试使用 DataTemplate 在 VisualTree 中绘制 ViewModel .

为避免这种情况,只需设置 CellTemplate到类似 ContentPresenter 的东西与 Content属性绑定(bind)到您的 ViewModel ,它将使用隐式 DataTemplates 呈现您的 ViewModel

<GridViewColumn Header="Some Header">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding YourViewModelProperty}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

关于c# - 如何将面向数据类型的 DataTemplate 与 GridView 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12501344/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com