C#/WINUI3:对ObservableCollection使用OrderBy()后,数据绑定无效



.xaml:的一部分

...
<ListView x:Name="DeviceList" ItemsSource="{x:Bind ViewModel.FliteredDevicesCollection,Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local1:BleDevice">
...
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
...

我创建了一个名为BleDivice的自定义类,并将ListView的ItemsSource绑定到ObservableCollection<BleDevice> FliteredDevicesCollection以显示集合中的设备。设备列表可以随集合动态更新,效果良好。

然后,我尝试重新排序我使用的FliteredDevicesCollection = new ObservableCollection<BleDevice>(FliteredDevicesCollection.OrderBy(BleDevice => BleDevice.SignalStrength));集合中的设备,但是,绑定无效。

我通过Debug打印了集合中的内容,发现它确实被重新排序了,但列表视图中的项不再随集合中的数据而更改。数据绑定似乎失败了。

是由这种方法OrderBy()引起的吗?我尝试了间接的方法,但仍然没有解决问题。那么,原因是什么以及如何解决这个问题,而不是在每次重新排序后使用.xaml.cs文件中的DeviceList.ItemsSource = ViewModel.FliteredDevicesCollection;等方法来重新绑定数据。

private ObservableCollection<BleDevice> flierDevicesCollection { get; set; } = new();
public ObservableCollection<BleDevice> FliteredDevicesCollection
{
get => flierDevicesCollection;
set
{
flierDevicesCollection = value; 
OnPropertyChanged("FliteredDevicesCollection");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

我已经添加了上面的代码,但它不起作用。奇怪的是,我可以向集合中添加对象或从集合FliteredDevicesCollection.Add(bleDevice);中删除对象,ListView正常更新,但我无法对集合中的对象进行重新排序。这些都应该发送通知。实际上,重新排序的进度已经完成,但它们之间的绑定失败了,结果无法显示在ListView中。那是什么原因呢?

您没有展示如何定义FliteredDevicesCollection属性,但我想说它不会通知属性更改,这是正确的。你所做的是一种懒惰的反模式。

应该绑定到CollectionViewSource,并使用该对象的相应属性设置筛选和/或排序。这就是该对象存在于所有XAML框架中的确切原因。

最新更新