WPF DataGrid and ITypedList
本文关键字:ITypedList and DataGrid WPF | 更新日期: 2023-09-27 18:16:52
我试图在我的ItemsSource
中实现ITypedList
,但PropertyDescriptor.GetValue/SetValue
从未被调用。这有什么不对吗?
XAML是这样的:
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApplication5"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="True">
<DataGrid.ItemsSource>
<local:RowCollection/>
</DataGrid.ItemsSource>
</DataGrid>
</Grid>
</Window>
RowCollection定义为:
public class RowCollection : ReadOnlyCollection<Row>, ITypedList {
readonly PropertyDescriptorCollection _properties;
public RowCollection() : base(new List<Row>()) {
_properties = new PropertyDescriptorCollection(new[] {
new RowDescriptor("Name"),
new RowDescriptor("Value")
}, true);
Items.Add(new Row());
Items.Add(new Row());
}
PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) {
return _properties;
}
string ITypedList.GetListName(PropertyDescriptor[] listAccessors) {
return null;
}
}
其中RowDescriptor为:
public class RowDescriptor : PropertyDescriptor {
public RowDescriptor(string name)
: base(name, new Attribute[0]) {
}
public override bool CanResetValue(object component) {
return false;
}
public override Type ComponentType {
get { return typeof(Row); }
}
public override object GetValue(object component) {
var row = (Row)component;
return row[Name];
}
public override bool IsReadOnly {
get { return false; }
}
public override Type PropertyType {
get { return typeof(string); }
}
public override void ResetValue(object component) {
throw new NotSupportedException();
}
public override void SetValue(object component, object value) {
var row = (Row)component;
row[Name] = String.Format("{0}", value ?? String.Empty);
}
public override bool ShouldSerializeValue(object component) {
return false;
}
}
And Row =
public class Row {
readonly Dictionary<string, string> _values;
public Row() {
_values = new Dictionary<string, string>();
this["Name"] = "Foo";
this["Value"] = "Bar";
}
public string this[string name] {
get {
if (!_values.ContainsKey(name))
return String.Empty;
return _values[name];
}
set {
_values[name] = value;
}
}
}
行对象需要ICustomTypeDescriptor实现。
http://social.msdn.microsoft.com/forums/en us/wpf/thread/177aef94 - 62 c5 - 438 d - a4a9 - 8834390559 -广告