xamlからコレクションをフィルターできますか?

c# mvvm observablecollection wpf
xamlからコレクションをフィルターできますか?

wpf-mvvmアプリケーションがあります。

ビューモデルに観察可能なコレクションがあります

public ObservableCollection ImportMessageList { get; set; }

「BatchImportResultMessageDto」には2つのプロパティが含まれています。

結果タイプとメッセージ。 結果のタイプは成功または失敗です。

あるリストボックスに成功を表示し、別のリストボックスに失敗を表示する必要があります。

私はこれを行うことができます。成功/失敗を保持するために、viewmodelに2つの観察可能なコレクションを持っています。

public ObservableCollection ImportFailureMessageList { get; set; } // To hold the failure messages.
public ObservableCollection ImportSuccessMessageList { get; set; } // To hold the sucess messages.

しかし、(新しい2つのコレクションなしで)フィルタリングできるようにする他の良い方法はありますか?

  8  3


ベストアンサー

CollectionViewSourceを使用してビューモデルのプロパティにし、 の代わりにそれをバインドすることができます。 XAMLから直接ImportMessageList`コレクション。 `ImportMessageList`コレクションを CollectionViewSource`のソースとして設定し、 `CollectionViewSource`でフィルタリングを行うための述語を設定します。

何かのようなもの:

private ICollectionView messageListView;
public ICollectionView MessageListView
{
    get { return this.messageListView; }
    private set
    {
      if (value == this.messageListView)
      {
        return;
      }

      this.messageListView = value;
      this.NotifyOfPropertyChange(() => this.MessageListView);
    }
}

...


this.MessageListView = CollectionViewSource.GetDefaultView(this.ImportMessageList);
this.MessageListView.Filter = new Predicate(this.FilterMessageList);

...

public bool FilterMessageList(object item)
{
  // inspect item as message here, and return true
  // for that object instance to include it, false otherwise
  return true;
}

11


これを行うには、2つのhttp://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx[CollectionViewSource]オブジェクトを作成し、それぞれにフィルターを設定します。

VMバインディングからxamlでCVSを作成する方法(http://www.wpftutorial.net/DataViews.html [ソース]):

コードビハインドでCVSをフィルター処理する方法(参照を行わない場合は、リフレクションを使用してモデルのプロパティを確認できます。 http://www.galasoft.ch/mydotnet/articles/article-2007081301.aspx [ソース]):

with(コードビハインド)

void MyCVS_Filter(object sender, FilterEventArgs e)
{
    CultureInfo item = e.Item as CultureInfo;
    if (item.IetfLanguageTag.StartsWith("en-"))
    {
        e.Accepted = true;
    }
    else
    {
        e.Accepted = false;
    }
}

10


タイトルとURLをコピーしました