gpt4 book ai didi

c# - WPF DataGrid 不会为 ICustomTypeDescriptor 属性生成列(但 Winforms DataGridView 会)

转载 作者:行者123 更新时间:2023-11-30 14:55:02 24 4
gpt4 key购买 nike

如标题所示,我有一个 DataGrid 和一个实现 ICustomTypeDescriptor 的 ViewModel,在运行时添加了一些属性。

public class PartCloneSettingsController : BaseController, ICustomTypeDescriptor
{
...
private List<StringPropertyDescriptor> generatedProperties;

private void generateProperties()
{
foreach (PartAttributeDefinition item in PartAttributes.DefinedAttributes)
{
var propertyDescriptor = new StringPropertyDescriptor(item.AttributeTitle, typeof(PartCloneSettingsController), item);

// attach value changed handler [ memory leak? TODO: Remove handler at some point...]
propertyDescriptor.AddValueChanged(this, OnGeneratedPropertyChanged);
generatedProperties.Add(propertyDescriptor);
}
}


public PropertyDescriptorCollection GetProperties()
{
// Get All Default (defined) properties
var properties = TypeDescriptor.GetProperties(this, true);

// concat default properties and generated properties into a single collection
var newProperties = new PropertyDescriptorCollection(properties.Cast<PropertyDescriptor>().Concat(generatedProperties).ToArray());

return newProperties;
}

}

XAML 中的数据网格定义:

<DataGrid x:Name="dataGrid" AutoGenerateColumns="True"  />

我这样设置 ItemsSource:

controller.LoadAssembly(ofd.FileName); // loads the file and creates a ObservableCollection of PartCloneSettingsControllers...

// set data grid source, doesn't create columns for generated properties...
overviewGrid.ItemsSource = controller.PartCloneSettingsControllers

// set data source from a winforms DataGridView which generates columns properly...
((System.Windows.Forms.DataGridView)wfhost.Child).DataSource = controller.PartCloneSettingsControllers;

其中 controller.PartCloneSettingsControllers 定义为:

public ObservableCollection<PartCloneSettingsController> PartCloneSettingsControllers {  get; private set; }

出于调试目的,我在 Winforms 控件主机中创建了一个 DataGridView 并将相同的 ViewModel 附加到它,瞧:Winforms 网格创建了所有列并显示了我想要的数据,但是 WPF DataGrid 无法生成列我的自定义属性(它适用于普通的普通属性)。

有没有人有使用 DataGrid、ICustomTypeDescriptor 和 AutoGenerateColumns=True 的工作解决方案(如果我在 XAML 中手动生成列,它工作正常,并且我可以绑定(bind)到我的所有属性...)

最佳答案

如果您的 PartCloneSettingsControllers是除 object 之外的某些项目类型的通用集合,它将使用通用参数类型来填充列,而不是集合中项目的运行时类型。

例如,如果您的收藏是 IEnumerable<PartCloneSettingsController> , 那么网格将只填充在 PartCloneSettingsController 上声明的属性的列类型(及其基本类型)1。它不会费心去检查集合中的实际对象,因为 ICustomTypeDescriptor在实例级别公开属性,网格将看不到这些属性。

如果您可以选择在类型或集合级别而不是项目实例级别公开您的“动态”属性(例如,通过使用 TypeDescriptionProviderITypedList ),那可能是您最好的选择。否则,您将不得不使用网格无法为其推断项目类型的集合类型(例如 List<object> );这将强制网格检查它遇到的第一个项目以确定列应该是什么。


1 网格最终使用 TypeDescriptor.GetProperties(Type componentType) 解析属性,而不是 TypeDescriptor.GetProperties(object component) ,因此如果没有要检查的实际项目,它就无法知道各个项目公开了哪些“动态”属性。

关于c# - WPF DataGrid 不会为 ICustomTypeDescriptor 属性生成列(但 Winforms DataGridView 会),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26383867/

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