我目前正在开发一个WinRT应用,需要按日期排序的ListView并按天分组。 ListView绑定到我的ViewModel中的ICollectionView
public Windows.UI.Xaml.Data.ICollectionView GroupedData {
get
{
return cvSource.View;
}
}
private Windows.UI.Xaml.Data.CollectionViewSource cvSource;
在我的XAML中,我可以将ListView绑定到此属性:
<ListView ItemsSource="{Binding GroupedData}"
现在我正在对我的basicData进行一些计算和过滤,它存储在List&lt;&gt;中。在我完成此操作后,分组通过LINQ发生:
var result = from DataObject in basicData
group DataObject by DataObject.Date
into date_grp orderby date_grp.Key
select date_grp;
最后,我将CollectionView的源设置为此新结果并触发OnPropertyChanged
cvSource.Source = result.ToList();
OnPropertyChanged("GroupdedData");
这正如我所料,但ListView现在每次填充新源时都会选择第一个元素。我按照Stackoverflow by sellmeadog
所述摆脱了这一点现在我想手动选择一个项目。这应该是更改CollectionView源之前的前一个选定项。保存上一个项目的最佳方法是什么,看看它是否在新创建的CollectionView中,选择它并滚动到它?
祝你好运
答案 0 :(得分:1)
对于选择senario,将一个新属性添加到ViewModel并将ListView的SelectedItem属性绑定到它:
public Windows.UI.Xaml.Data.ICollectionView GroupedData {
get
{
return cvSource.View;
}
}
public YourObjectType CurrentItem {
get {
return this.currentItem;
}
set {
if (this.currentItem != value) {
this.currentItem = value;
this.OnPropertyChanged("CurrentItem");
}
}
}
private YourObjectType currentItem;
private Windows.UI.Xaml.Data.CollectionViewSource cvSource;
然后在设置源之前,保持对当前项的引用
var current = this.CurrentItem;
cvSource.Source = result.ToList();
this.CurrentItem = current;
假设您的DataObjects类型重写Equals方法,ListView会在集合中查找并选择它。如果没有,您可能需要在新集合中添加代码查找它的实例并将其分配给CurrentItem属性。
但是通过选择项目并不代表ListViewScrolls。您可能需要拨打ListView.BringIntoView才能滚动到所选项目。
答案 1 :(得分:0)
您需要ObservableComputations。使用该库,您可以像这样进行编码:
private INotifyCollectionChanged _groupedData
public INotifyCollectionChanged GroupedData =>
_groupedData = _groupedData ?? basicData.Grouping(dataObject => dataObject.Date)
.Selecting(date_grp => date_grp.Key);
GroupedData反映了basicData集合中的所有更改。不要忘记将INotifyPropertyChanged接口的实现添加到DataObject类,以便GroupedData集合反映dataObject.Date属性中的更改。 GroupedData是一个单例实例,因此您不会在ListView中丢失项目选择。