我有一个自定义集合,我将其传递给一个WPF客户端,该客户端使用
我还应该提到,我尝试实现上述两个接口,但它们似乎与此问题无关。
(您可能实际上不想查看示例代码,因为它没有任何有趣的东西。集合实现只是包装内部List。)
一些随机的POCO:
XAML代码如下:
窗口的代码后台:
顺便说一下,如果您将代码后台更改为使用List<Person>而不是MyCollection<Person>,则一切都按预期工作。
编辑:
上面的代码不是从实际情况中提取的。 我只是发布它以展示我正在做什么来测试我的问题,并使其更容易复制。 实际的自定义集合对象非常复杂,我无法在此处发布它。 再次强调,我只是试图理解需要完成哪些基本概念,以便数据网格可以正确地绑定到自定义集合并自动生成底层对象的列。
AutoGenerateColumns="True"
将集合绑定到datagrid
。然而,datagrid显示空行(尽管是正确数量的空行)。我做错了什么?以下是一些示例代码。暂时省略与INotifyPropertyChanged
和INotifyCollectionChanged
相关的所有内容,因为我首先想在网格中显示一些数据。我还应该提到,我尝试实现上述两个接口,但它们似乎与此问题无关。
(您可能实际上不想查看示例代码,因为它没有任何有趣的东西。集合实现只是包装内部List。)
一些随机的POCO:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
简单的集合实现:
public class MyCollection<T> : IList<T>
{
private List<T> list = new List<T>();
public MyCollection()
{
}
public MyCollection(IEnumerable<T> collection)
{
list.AddRange(collection);
}
#region ICollection<T> Members
public void Add(T item)
{
list.Add(item);
}
public void Clear()
{
list.Clear();
}
public bool Contains(T item)
{
return list.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
list.CopyTo(array, arrayIndex);
}
public int Count
{
get { return list.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(T item)
{
return list.Remove(item);
}
#endregion
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator()
{
return list.GetEnumerator();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
#region IList<T> Members
public int IndexOf(T item)
{
return list.IndexOf(item);
}
public void Insert(int index, T item)
{
list.Insert(index, item);
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
}
public T this[int index]
{
get { return list[index]; }
set { list[index] = value; }
}
#endregion
}
XAML代码如下:
<Window x:Class="TestWpfCustomCollection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="True"
HorizontalAlignment="Stretch"
Name="dataGrid1" VerticalAlignment="Stretch"
ItemsSource="{Binding}"
/>
</Grid>
</Window>
窗口的代码后台:
public MainWindow()
{
InitializeComponent();
MyCollection<Person> persons = new MyCollection<Person>()
{
new Person(){FirstName="john", LastName="smith"},
new Person(){FirstName="foo", LastName="bar"}
};
dataGrid1.DataContext = persons;
}
顺便说一下,如果您将代码后台更改为使用List<Person>而不是MyCollection<Person>,则一切都按预期工作。
编辑:
上面的代码不是从实际情况中提取的。 我只是发布它以展示我正在做什么来测试我的问题,并使其更容易复制。 实际的自定义集合对象非常复杂,我无法在此处发布它。 再次强调,我只是试图理解需要完成哪些基本概念,以便数据网格可以正确地绑定到自定义集合并自动生成底层对象的列。