2013-06-05 6 views
2

Я попытался реализовать ITypedList в моем ItemsSource, но PropertyDescriptor.GetValue/SetValue никогда не вызывается. Что в этом плохого?WPF DataGrid и ITypedList

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

И Роу является:

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

P.S. Он отлично работает для WinForms. –

+0

P.P.S. Он отлично работает с Syncfusion DataGrid. –

ответ