Могу ли я отфильтровать коллекцию из xaml? - PullRequest
8 голосов
/ 07 февраля 2011

У меня есть приложение wpf-mvvm.

У меня есть наблюдаемая коллекция в моей модели представления

public ObservableCollection<BatchImportResultMessageDto> ImportMessageList { get; set; } 

"BatchImportResultMessageDto" содержит два свойства ..

тип результата..и сообщение.Тип результата может быть успешным или неудачным.

Мне нужно отобразить успех в одном списке ... и отказ в другом списке.

Я могу сделать это ... имея 2 наблюдаемые коллекции в viewmodelудерживать успех / неудачу.

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

Но есть ли другой способ лучше, чтобы я мог отфильтровать его (без новых двух коллекций)?

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

Вы можете сделать это, создав два CollectionViewSource объекта и установив фильтр для каждого из них.

Как создать CVS в xaml из привязки виртуальной машины ( Источник ):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <CollectionViewSource Source="{Binding}" x:Key="customerView">
           <CollectionViewSource.GroupDescriptions>
               <PropertyGroupDescription PropertyName="Country" />
           </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <ListBox ItemSource="{Binding Source={StaticResource customerView}}" />
</Window>

Как отфильтровать CVS в коде позади (Вы можете использовать отражение, чтобы посмотреть на свойства вашей модели, если не хотите ссылаться на нее. Источник ):

<CollectionViewSource x:Key="MyCVS"
                              Source="{StaticResource CulturesProvider}"
                              Filter="MyCVS_Filter" />

с (код сзади)

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;
    }
}
11 голосов
/ 07 февраля 2011

Вы можете использовать CollectionViewSource и сделать его свойством вашей модели представления и связать его с вашей коллекцией ImportMessageList непосредственно из XAML.Установите вашу коллекцию 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<object>(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;
}
...