C# ListView不会在源代码更改时更新-即使我实现了PropertyChanged
我已经为这个问题挣扎了几个小时: 我正在MVVM模式中构建一个UWP应用程序 问题:当我更改ItemSource属性的值时,我无法让我的ListView的ItemSource更新/重新绑定到ObservableCollection的新实例,即使我已经对该属性实现了IPropertyChanged 详细信息: 我正在处理的页面有一个ListView,ItemSource绑定到一个可观察的集合: 第页: watter属性已实现,因此它在ViewModel中引发PropertyChangedEvent:C# ListView不会在源代码更改时更新-即使我实现了PropertyChanged,c#,xaml,listview,observablecollection,propertychanged,C#,Xaml,Listview,Observablecollection,Propertychanged,我已经为这个问题挣扎了几个小时: 我正在MVVM模式中构建一个UWP应用程序 问题:当我更改ItemSource属性的值时,我无法让我的ListView的ItemSource更新/重新绑定到ObservableCollection的新实例,即使我已经对该属性实现了IPropertyChanged 详细信息: 我正在处理的页面有一个ListView,ItemSource绑定到一个可观察的集合: 第页: watter属性已实现,因此它在ViewModel中引发PropertyChangedEvent
public ObservableCollection<Order> Orders {
get { return _Orders; }
set { Set(ref _Orders, value); }
}
private ObservableCollection<Order> _Orders;
(...)
//Property changed implementation from video (06:48): https://mva.microsoft.com/en-US/training-courses/windows-10-data-binding-14579?l=O5mda3EsB_1405632527
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
//If property is updated with, raise property changed, else don't
public bool Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(storage, value))
return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
public bool Waiter
{
get { return _waiter; }
set { Set(ref _waiter, value); FilterView(); }
}
private bool _waiter;
按钮在UI中更新-这很好
在设置了_waiter的私有字段之后,我还想过滤掉一些我不想显示的数据
我在FilterView()中执行此操作;方法。
这是通过创建新的ObservableCollection并设置Orders属性来完成的:
public void FilterView()
{
var filteredOrderList = new ObservableCollection<Order>();
//Sorting is done
Orders = filteredOrderList;
}
public void FilterView()
{
var filteredOrderList=新的ObservableCollection();
//排序完成了
订单=filteredOrderList;
}
现在。我认为代码是:Orders=filteredOrderList;将触发Orders属性的“setter”,并引发PropertyChanged事件,就像它对按钮和所有其他工作正常的UI元素所做的那样,并告诉ListView重新绑定到它。然而,ListView似乎是在ObservableCollection的旧实例上运行的,它并不关心我的PropertyChanged事件被触发
我已经调试了这个程序,我看到filteredOrderList包含了我想要的数据,并且顺序已经改变了。但就像ViewList不关心触发PropertyChanged事件一样
我不想在ObservaleCollection中添加和删除项,因为筛选变得非常复杂。。。我只想用一个新的替换Orders ObservableCollection,并让ViewList反映我的更改
我错过什么了吗?我不能多次调用PropertyChanged事件吗?(我调用它一次是为了更新按钮,一次是为了更改OrdersObservableCollection)
为什么ListView没有重新绑定到新列表-ListView是否不关心正在触发的PropertyChanged事件
我将非常感谢任何能解决这个问题或让我走上正确方向的答案或解决方法
谢谢,很抱歉发了这么长的帖子。看看这两个:
- 8个半小时后,我发现了我的错误:
我意外地定义了DataContext两次:
<Page.DataContext>
<vm:OrderPageViewModel/>
</Page.DataContext>
在ListView之前的XAML文件中:
<Grid.DataContext>
<vm:OrderPageViewModel/>
</Grid.DataContext>
这导致了我的OrderPageViewModel的两个实例
然后,我的ViewList被绑定到ViewModel的旧实例,对ObservableCollection的新ViewModel实例的任何更改都不会反映任何更改
如果其他人得到了相同的问题:视图列表在更改ObservableCollection时不会更新-这是因为您创建了ObservableCollection的多个实例
我还发现,ObservaleCollection只有在添加og、从中删除对象并使用.Add()、.Remove()和.Clear()方法清除对象时才会更新。如果不在属性本身中实现它,就不能调用“CollectionChanged”或“PropertyChanged”,就像我在Water属性中所做的那样
我重新设计了过滤函数以清除集合并向其中添加新元素。它解决了我的问题。:-)
如果你不小心的话,XAML中的3行代码真的会把你的一天搞得一团糟
祝您度过愉快的一天,感谢您之前发布答案的朋友:-)有没有办法手动更新视图列表?没有从其ItemSource中添加或删除项目?感谢您的回答。我已经读过“常见错误…”这篇文章,这很有道理:)我可能会在另一次看“排序可观察的集合C”。找到了另一种解决方法。这看起来很奇怪,你甚至可以更改每个ui元素的DataContext,不是吗?@MatthiasHerrmann-你可以全局指定元素的DataContext(就像我在第页中所做的那样),并且每个子元素都会有这个DataContext。现在,如果我想为page元素中的子元素指定一个不同的datacontext,那么我必须像在网格中那样指定另一个datacontext。然后,网格及其子元素可以绑定到全局datacontext中未指定的其他数据。有人会在某个地方使用它,这是很有道理的。然而,我的错误是,我两次将同一个对象指定为datacontext,导致了一个新实例,而我没有意识到这一点,因此出现了错误。
public void FilterView()
{
var filteredOrderList = new ObservableCollection<Order>();
//Sorting is done
Orders = filteredOrderList;
}
<Page.DataContext>
<vm:OrderPageViewModel/>
</Page.DataContext>
<Grid.DataContext>
<vm:OrderPageViewModel/>
</Grid.DataContext>