导航到 ListCollectionView 中的特定项目

Navigate to a specific item inside ListCollectionView

我正在尝试根据 SelectedDay 的日期 属性 的值导航到 ListCollectionView 中的特定项目。

虚拟机

private Day _selectedDay;
public Day SelectedDay    // the Name property
{
     get { return _selectedDay; }
     set { _selectedDay = value; RaisePropertyChanged(); }
}

public ObservableCollection<ShootingDay> AllShootingDayInfo {get; set;}

private ListCollectionView _shootingDayInfoList;
public ListCollectionView ShootingDayInfoList
{
    get
    {
        if (_shootingDayInfoList == null)
        {
            _shootingDayInfoList = new ListCollectionView(AllShootingDayInfo);}
            return _shootingDayInfoList;
    }
    set
    {
        _shootingDayInfoList = value; RaisePropertyChanged();
    }
}

<Day> 对象具有 Date 的 属性,我希望它与 <ShootingDay> 中的 Date 属性 相匹配对象,以便我可以导航到 ShootingDayInfoList 中的项目,其中 SelectedDay.DateShootingDayInfoList 中项目的 Date 相匹配。

我已经试过了,但这不起作用,因为所选项目不是同一对象的一部分。

ShootingDayInfoList.MoveCurrentTo(SelectedDay.Date);

我怎样才能完成这项工作?我对这一切都很陌生。

您需要 Filter 谓词来获取所需的项目,然后删除 Filter 以恢复所有项目。

代码

ViewModel vm = new ViewModel();
System.Diagnostics.Debug.WriteLine(vm.ShootingDayInfoList.Count.ToString());
vm.SelectedDay.Date = DateTime.Parse("12/25/2015");

vm.ShootingDayInfoList.Filter = (o) =>
{
    if (((ShootingDay)o).Date.Equals(vm.SelectedDay.Date))
        return true;

    return false;
};

ShootingDay foundItem = (ShootingDay)vm.ShootingDayInfoList.GetItemAt(0);
vm.ShootingDayInfoList.Filter = (o) => { return true; };

vm.ShootingDayInfoList.MoveCurrentTo(foundItem); 

我已经使用 MoveCurrentToNext() method 检查了代码,它工作正常。 这种方法不会影响您现有的代码。

第二种方法,直接使用AllShootingDayInfo或使用SourceCollection属性获取底层Collection

    ViewModel vm = new ViewModel();
    System.Diagnostics.Debug.WriteLine(vm.ShootingDayInfoList.Count.ToString());
    vm.SelectedDay.Date = DateTime.Parse("12/23/2015");

    IEnumerable<ShootingDay> underlyingCollection = ((IEnumerable<ShootingDay>)vm.ShootingDayInfoList.SourceCollection);

    ShootingDay d1 = underlyingCollection.FirstOrDefault(dt => dt.Date.Equals(vm.SelectedDay.Date)); 

    vm.ShootingDayInfoList.MoveCurrentTo(d1);