这里有一个小背景故事。我有一个公共(public)属性(property)(typeof(ObservableCollection<Area>))
我绑定(bind)了一个 TreeView 。我想更新树,但我不想重绘整个树并丢失所选项目、节点的折叠/展开状态以及我忘记实现的任何其他内容。所以我想我需要更新集合中的区域。我注意到使用 FirstOrDefault 语句并将其设置为等于某个值实际上并不会更改可观察集合中的区域:
var areas = GetAreaInfo(); //Entity Framework query returns ObservableCollection<Area>
foreach (Area a in areas)
{
var αrea = Areas.FirstOrDefault(α => α.Id == a.Id);
if (αrea != null)
αrea = a; //αrea changes, but Area[0] which is supposed to be αrea doesn't
}
我可以获取对象的引用或指针,这样我就不必遍历可观察集合并使用索引吗?
最佳答案
你实际上并没有做你认为自己在做的事情。在你的情况下,面积只是一个变量。当您设置area = a时,您将重置“area”变量指向的位置,而根本不会更改可观察集合。
最好的办法是更新area的所有属性以匹配a的属性。通常很容易编写 Clone 或 Copy 方法将属性从对象的一个实例复制到另一个实例。您的另一个选择是从集合中删除区域并添加一个区域,但这可能会导致一些排序问题。
编辑:关于您的实际问题,是的,可能在 C# 中获取指针,但这是一个坏主意。这将需要编写更多的工作,需要您将代码标记为不安全,并且将来的维护将更加困难。
关于C# 指向对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613490/