gpt4 book ai didi

c# - WPF:实现和绑定(bind)(数据网格)到自定义集合

转载 作者:太空狗 更新时间:2023-10-29 21:14:42 26 4
gpt4 key购买 nike

我有一个要传递给 WPF 客户端的自定义集合,该客户端使用 AutoGenerateColumns="True" 将该集合绑定(bind)到 datagrid。但是,数据网格显示空行(尽管空行数正确)。我究竟做错了什么?以下是一些示例代码。现在我已经省略了与 INotifyPropertyChangedINotifyCollectionChanged 相关的所有内容,因为我首先想要在网格中显示一些数据。

我还应该提一下,我已经尝试实现上述两个接口(interface),但它们似乎与这个问题无关。

(您可能真的不想看示例代码,因为它绝对没有什么有趣的地方。集合实现只是包装了一个内部列表。)

一些随机的 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 而不是 MyCollection ,一切都会按预期工作。

编辑:

以上代码并非取自真实情况。我发布它只是为了展示我在做什么,以便测试我的问题并使其更容易复制。 实际的自定义集合对象非常复杂,我不能在这里发布。同样,我只是想了解为使数据网格正确绑定(bind)到自定义集合并自动为底层对象生成列而需要完成的工作背后的基本概念。

最佳答案

显然,为了使 AutoGenerateColumns 在 WPF DataGrid 中工作,您的集合必须实现 IItemProperties ,尽管我发现将我的集合包装在(Windows 窗体)BindingList 中也能达到目的(它实际上包装了您的集合,不像 ObservableCollection 只是将您的集合成员复制到自身中)。

关于c# - WPF:实现和绑定(bind)(数据网格)到自定义集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5234186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com