wpf MVVM可观测采集<;字符串>;不更新视图

wpf MVVM可观测采集<;字符串>;不更新视图,wpf,mvvm,observablecollection,Wpf,Mvvm,Observablecollection,我遇到一个问题,我的ObservableCollection没有更新视图。我可以在OnPropertyChange之前放置一个断点,并可以验证我的集合中是否包含名称 在我的模型中,有一个事件触发一个包含随机名称的列表 在我的视图模型中,我订阅了这个事件,而我的事件处理程序就是这样做的 void _manager_ProcessesChanged(List<string> n) { //create a new collection to hold curren

我遇到一个问题,我的ObservableCollection没有更新视图。我可以在OnPropertyChange之前放置一个断点,并可以验证我的集合中是否包含名称

在我的模型中,有一个事件触发一个包含随机名称的列表

在我的视图模型中,我订阅了这个事件,而我的事件处理程序就是这样做的

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实现。