【问题标题】:Efficiently implementing ICollectionView for Filtering高效实现 ICollectionView 进行过滤
【发布时间】:2013-06-01 19:39:27
【问题描述】:

我刚刚在我的第一个 MVVM 项目中实现了一个ICollectionView,并且我让它工作了。不过,我认为实施可能会更好、更流畅。我将发布与我的ICollectionView 相关的代码,如果有人可以给我任何关于如何简化或改进它的提示或建议,请告诉我。这是我的代码:

private ICollectionView _advFilter;

public ICollectionView AdventurerFilter
{
    get { return _advFilter; }
    set
    {
        if (_advFilter != value)
        {
            _advFilter = value;
            RaisePropertyChanged(() => AdventurerFilter);
        }
    }
}


public MainViewModel()
{
    AdvNoFilter();
}


public void LoadGameExecute()
{
    //Serialization Logic

    AdvNoFilter();
}

public void ShowAllExecute()
{
    AdvNoFilter();
}

public void ShowEmployedExecute()
{
    AdvFilter(AdvStatus.Employed);
}

public void ShowAvailableExecute()
{
    AdvFilter(AdvStatus.Available);
}


void AdvFilter(AdvStatus status)
{
    AdventurerFilter = CollectionViewSource.GetDefaultView(Adventurers);
    AdventurerFilter.Filter = adv => ((Adventurer)adv).Status.Equals(status);
}

void AdvNoFilter()
{
    AdventurerFilter = CollectionViewSource.GetDefaultView(Adventurers);
    AdventurerFilter.Filter = null;
}

所有这些都在我的MainViewModel 中。 Show...Execute 命令绑定到我的MainView 中的按钮,数据显示在绑定到AdventurerFilterListBox 中。就像我之前伤心的那样,它有效,但我严重怀疑这不能更有效地完成。任何建议将不胜感激!

编辑:我应该早点提到这一点,但 AdventurersObservableCollection

【问题讨论】:

  • 为什么你不能使用内置列表之一? ObservableCollection<> 可以做你需要的,或者你可以从这里使用SortableObservableCollectionsortablecollection.codeplex.com
  • Adventurers 是一个ObservableCollection。您发布的链接根本不包括过滤。

标签: c# mvvm filtering icollectionview


【解决方案1】:

此代码不是ICollectionView实现。它只是使用默认实现,通过CollectionViewSource.GetDefaultView获得。

可以缓存获取到的ICollectionView,不用每次换过滤器时都赋值:

private ICollectionView _advFilter;

public MainViewModel()
{
    // assuming that Adventurers is ObservableCollection<Adventurer>
    _advFilter = CollectionViewSource.GetDefaultView(Adventurers);

    AdvNoFilter();
}

public void ShowEmployedExecute()
{
    AdvFilter(AdvStatus.Employed);
}

public void ShowAvailableExecute()
{
    AdvFilter(AdvStatus.Available);
}

void AdvFilter(AdvStatus status)
{
    _advFilter.Filter = adv => ((Adventurer)adv).Status.Equals(status);
    _advFilter.Refresh();
}

void AdvNoFilter()
{
    _advFilter.Filter = null;
    _advFilter.Refresh();
}

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2016-04-07
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多