gpt4 book ai didi

c# - ObservableCollection 不更新 View

转载 作者:可可西里 更新时间:2023-11-01 08:45:12 25 4
gpt4 key购买 nike

我刚刚开始使用 MVVM 并且遇到了一个障碍,我希望有人可以帮助我。我正在尝试创建一个带有 2 个列表框的简单 View 。第一个列表框中的选择将填充第二个列表框。我创建了一个类,用于存储我要绑定(bind)的信息。

MyObject类(Observable Object只是一个实现了INotifyPopertyChanged的基类)

public class MyObject : ObservableObject
{
String _name = String.Empty;
ObservableCollection<MyObject> _subcategories;

public ObservableCollection<MyObject> SubCategories
{
get { return _subcategories; }

set
{
_subcategories = value;
RaisePropertyChanged("SubCategories");
}
}

public String Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}


public MyObject()
{
_subcategories = new ObservableCollection<EMSMenuItem>();
}
}

在我的 View 模型中,我创建了两个 ObservableCollections

public ObservableCollection<EMSMenuItem> Level1MenuItems { get; set; }
public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; }

在我的 ViewModel 构造函数中:

this.Level1MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level2MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml");

这对于 Level1 项目来说效果很好,它们在 View 中正确显示。但是,当用户单击列表框中的项目时,我有一个命令被调用,它具有以下内容:

Level2MenuItems = ClickedItem.SubCategories;

出于某种原因,这不会更新第二个列表框的用户界面。如果我在这个位置放置一个断点,我可以看到 Level2MenuItems 中存储了正确的信息。如果我编写一个 foreach 循环并将它们单独添加到 Level2MenuItems 集合中,那么它会正确显示。

另外,作为测试,我在构造函数中添加了以下内容:

Level2MenuItems = Level1MenuItems[0].SubCategories;

并且更新正确。

那么,为什么代码在构造函数中或在循环时按预期工作,但在用户单击列表框中的项目时却没有?

最佳答案

您需要在 Level2MenuItems 属性上引发更改通知。

而不是拥有

public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; }

你需要

private ObservableCollection<EMSMenuItem> _level2MenuItems;
public ObservableCollection<EMSMenuItem> Level2MenuItems
{
get { return _level2MenuItems; }
set
{
_level2MenuItems = value;
RaisePropertyChanged(nameof(Level2MenuItems));
}
}

前者在构造函数中起作用的原因是 Binding 尚未发生。但是,由于您正在通过绑定(bind)后发生的命令执行更改引用,因此您需要告诉 View 它已更改

关于c# - ObservableCollection 不更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555729/

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