WPF DataGrid和ITypedList

时间:2013-06-05 00:35:49

标签: c# .net wpf wpfdatagrid wpf-4.5

我尝试在ITypedList中实施ItemsSource,但永远不会调用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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)