如何将绑定到CollectionViewSource的ListView滚动到所需的项目后进行更新

时间:2015-05-06 14:17:14

标签: c# listview windows-runtime collectionviewsource

我目前正在开发一个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中,选择它并滚动到它?

祝你好运

2 个答案:

答案 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中丢失项目选择。