如标题所示,我有一个 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 定义:
<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 中手动生成列,它工作正常,我可以绑定到我的所有属性......)