为什么绑定到struct不起作用?

我最近遇到了一个问题,我有一个绑定到ListView的ObservableCollection。 人是我写的结构。 只要我在绑定之前设置People对象的值,一切似乎都可以正常工作。 但是,当我尝试在运行时从GUI设置值时,基础对象似乎不反映更改。

我最终通过简单地将People从一个结构改为一个类来克服了这个问题。 不需要进行其他更改。

有人可以向我解释为什么会这样吗?

您的绑定获取结构的副本,因为结构通过值传递给方法。 如果绑定更新了某些内容; 内存中的副本正在被修改,因此您的原始对象不会更新。

因为struct通过值传递给控件,​​因此当您在UI中进行更改时,WPF会将更改写回到People的其他实例。

把它改成一个类,它会工作。

除非你完全理解struct的目的,否则我建议不要使用它。

ListView是一个ItemsControl,可以直接模式工作,通过在XAML中声明服务器ListViewItem对象或在ItemsSource模式下填充ItemsSource属性的Binding来填充它的Items

请参阅WPF博士的文章以获得一个很好的解释 。

无论哪种方式,ListView.Items都是一个ItemCollection,它是一个CollectionView,即Items不是您提供给ItemsSource属性的实际集合,而是您提供的集合的规范化副本,它允许框架例如通过索引访问底层IEnumerable即使IEnumerable本身不提供索引器。

由于ListView使用副本,当它使用类实例的集合时,它可以创建引用的副本,两个引用都指向内存中的同一个对象,因此通过另一个引用可以看到更改其中一个引用中的值的效果,但是当它使用值类型的结构集合时,它必须复制值,而不是有两个指向同一对象的引用,那么你有两个不同的值类型对象。

对于所有对此主题感兴趣的人:我使用Combobox和Objectdataprovider运行它。 “ItemsSource”是结构,但“SelectedItem”是在其他地方编写的。 这里是:

         

这就是结构的样子:

 public struct MyStruct { public const string A = "A"; public const string B = "B"; public const string C = "C"; public static IEnumerable GetValues(Type type) { List retVals = new List(); FieldInfo[] fi = type.GetFields(); foreach (FieldInfo info in fi) { retVals.Add(info.Name); } return retVals; } }