0

ICollectionView最初のMVVMプロジェクトに実装したところ、動作しています。ただし、実装はより良く、より流動的になる可能性があると思います。私に関連するコードを投稿します。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 コマンドは my のボタンにバインドされMainView、データは にListBoxバインドされた に表示されAdventurerFilterます。前に悲しかったように、うまくいきますが、これ以上効率的にできないと真剣に考えています。アドバイスをいただければ幸いです。

編集:これについては以前に言及する必要がありましたAdventurersが、ObservableCollection.

4

1 に答える 1

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();
}
于 2013-06-01T21:15:24.290 に答える