【问题标题】:wpf MVVM ObservableCollection<string> does not update viewwpf MVVM ObservableCollection<string> 不更新视图
【发布时间】:2011-08-25 08:38:51
【问题描述】:

我的 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;
    }

我的 Names 属性看起来像这样

ObservableCollection<string> _names = new ObservableCollection<string>();
public ObservableCollection<string> Names
    {
        get { return _names; }
        set
        {
            _names = value;
           OnPropertyChanged("Names");
        }
    }

我的视图绑定看起来像这样

<Window.DataContext>
    <vm:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <ListBox ItemsSource="{Binding Path=Names}"/>
</Grid>

如果我将&lt;string&gt; 的集合更改为&lt;int&gt;,它似乎工作正常......我错过了什么?

【问题讨论】:

  • 仅供参考,_manager_ProcessesChanged 可以简化为一行:Names = new ObservableCollection&lt;string&gt;(n);
  • 我这样做的原因是因为事件是从另一个线程触发的。这是我可以弄清楚如何解决跨线程问题的唯一方法

标签: wpf mvvm observablecollection


【解决方案1】:

如果您重新实例化 ObservableCollection,您将失去与集合的绑定。

您应该 .Clear(...) 和 .Add(...) 项目,您还应该将 ObservableCollection Names 更改为自动属性。此处无需调用 OnPropertyChanged,由类型为您处理。

【讨论】:

  • 真的没有办法重新实例化并保持绑定吗?
  • @FrancoisBotha 一种方法是将 RaisePropertyChanged 方法添加到 ObservableCollection 设置器中。然后 UI 将在重新实例化后更新。它有效,但我不知道为什么。根据微软文档,ObservableCollection 应该有一个内置的 INPC 实现。
【解决方案2】:

我也遇到过这种情况。不确定这是否是理想的解决方案(肯定看起来不像),但这对我有用

void _manager_ProcessesChanged(List<string> n)
{
    Names.Clear();

    //copy ids into our collection
    foreach (string name in n)
    {
        Names.Add(name);
    }
}

【讨论】:

  • 这是你应该做的,因为 ObservableCollection 已经通知 UI 而不必为集合实现 INotifyPropertyChanged。
  • 同样的结果,列表框为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多