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;
        }
    }
}

WPF DataGrid and ITypedList

行对象需要ICustomTypeDescriptor实现。

http://social.msdn.microsoft.com/forums/en us/wpf/thread/177aef94 - 62 c5 - 438 d - a4a9 - 8834390559 -广告