【问题标题】:ObservableCollection does not update UI [duplicate]ObservableCollection 不更新 UI [重复]
【发布时间】:2019-03-16 15:16:09
【问题描述】:

在启动时,我将 ObservableCollection 绑定到菜单:

Menu.ItemsSource = _manager.Selection;

此菜单正确显示集合中的所有对象。

现在我想更新集合并添加/删除其中的一些项目:

private void OnBoxClick(object sender, RoutedEventArgs e)
    {
        _manager.Selection = _manager.GetNewSelection();
        PropertyChanged?.Invoke(this, new CollectionChangeEventArgs(CollectionChangeAction.Refresh, _manager.Selection));
    }

    public event CollectionChangeEventHandler PropertyChanged;

但 ui 仍然显示它之前的样子..

缺少什么?

【问题讨论】:

  • 当您似乎从不添加或删除元素时,为什么它根本是 ObservableCollection?使用普通的public List<Selection> Selections 属性,该属性在设置时会触发 INotifyPropertyChanged 接口的 PropertyChanged 事件。

标签: c# wpf data-binding


【解决方案1】:

您应该将Menu.ItemsSource 属性重新设置为_manager.GetNewSelection(),或者在_manager.Selection 中添加或删除项目。将_manager.Selection 字段设置为ObservableCollection<T> 的另一个实例不会影响菜单的ItemsSource 属性。

如果您从_manager.GetNewSelection() 获得了全新的收藏,您不妨这样做:

private void OnBoxClick(object sender, RoutedEventArgs e)
{
    Menu.ItemsSource = _manager.GetNewSelection();
}

然后,_manager.GetNewSelection 是否返回 ObservableCollection 或任何其他在添加或删除项目时不提供通知的 IEnumerable 都无关紧要。

【讨论】:

  • 或使用Binding 将菜单的itemsSource 设置为经理的Selection 属性
  • 是的,但是由于 OnBoxClick 显然是视图中的事件处理程序,因此这里没有真正的绑定点。
  • 所以现在我清除了选择,然后添加了“新”对象。之后我触发了 propertychanged 事件,但它仍然没有刷新菜单。我也尝试设置 itemssource = _manager.GetNetSelection() 但它仍然没有刷新 ui
  • @Loading:那你碰错了实例或者集合没有改变。
  • 问题是我无法在菜单“onclick”功能中使用此代码。我不得不使用 mouseenter 来触发“更新”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2016-12-17
  • 2014-12-15
  • 2012-04-22
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多