wpf MVVM可观测采集<;字符串>;不更新视图
我遇到一个问题,我的ObservableCollection没有更新视图。我可以在OnPropertyChange之前放置一个断点,并可以验证我的集合中是否包含名称 在我的模型中,有一个事件触发一个包含随机名称的列表 在我的视图模型中,我订阅了这个事件,而我的事件处理程序就是这样做的wpf MVVM可观测采集<;字符串>;不更新视图,wpf,mvvm,observablecollection,Wpf,Mvvm,Observablecollection,我遇到一个问题,我的ObservableCollection没有更新视图。我可以在OnPropertyChange之前放置一个断点,并可以验证我的集合中是否包含名称 在我的模型中,有一个事件触发一个包含随机名称的列表 在我的视图模型中,我订阅了这个事件,而我的事件处理程序就是这样做的 void _manager_ProcessesChanged(List<string> n) { //create a new collection to hold curren
void _manager_ProcessesChanged(List<string> n)
{
//create a new collection to hold current Ids
ObservableCollection<string> names = new ObservableCollection<string>();
//copy ids into our collection
foreach (string name in n)
{
names.Add(name);
}
Names = names;
}
void\u管理器\u流程已更改(列表n)
{
//创建新集合以保存当前ID
ObservableCollection名称=新的ObservableCollection();
//将ID复制到我们的集合中
foreach(n中的字符串名称)
{
名称。添加(名称);
}
姓名=姓名;
}
我的名字是这样的
ObservableCollection<string> _names = new ObservableCollection<string>();
public ObservableCollection<string> Names
{
get { return _names; }
set
{
_names = value;
OnPropertyChanged("Names");
}
}
observetecollection\u name=newobservetecollection();
公共可观测集合名称
{
获取{return\u names;}
设置
{
_名称=值;
关于财产变更(“名称”);
}
}
我的观点是这样的
<Window.DataContext>
<vm:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<ListBox ItemsSource="{Binding Path=Names}"/>
</Grid>
如果我将
的集合更改为
,它似乎可以正常工作。。我错过了什么?我也遇到了这个问题。不确定这是否是理想的解决方案(当然看起来不像),但这对我来说很有效
void _manager_ProcessesChanged(List<string> n)
{
Names.Clear();
//copy ids into our collection
foreach (string name in n)
{
Names.Add(name);
}
}
void\u管理器\u流程已更改(列表n)
{
name.Clear();
//将ID复制到我们的集合中
foreach(n中的字符串名称)
{
名称。添加(名称);
}
}
如果重新实例化ObservableCollection,您将失去与该集合的绑定
您应该.Clear(…)和.Add(…)项,还应该将ObservableCollection名称更改为自动属性。无需在此处调用OnPropertyChanged,因为它由类型为您处理。这是您应该做的,因为ObservableCollection已经通知UI,而无需为集合实现INotifyPropertyChanged。同样的结果,Listbox为emptyFYI,
\u manager\u processes changed
可以简化为一行:名称=新的可观察集合(n)代码>我这样做的原因是因为事件是从另一个线程触发的。这是我唯一能解决交叉线程问题的方法。真的没有办法重新实例化并保持绑定吗?@FrancoisBotha一种方法是将RaisePropertyChanged方法添加到ObservableCollection setter中。然后UI将在重新实例化后更新。这很有效,但我不知道为什么。根据microsoft文档,ObservableCollection应具有内置的INPC实现。