2015-01-30 3 views
0

У меня есть сетка данных, которая связывает ObservableCollection. Существует поле «Статус». Мне нужно отфильтровать по статусу, нажав кнопку фильтра. Я использую MVVM и нуждаюсь в фильтрации внутри класса VM.Фильтрация ObservableCollection в WPF MVVM

<DataGrid 
    CanUserResizeColumns="False" CanUserResizeRows="False" IsEnabled="{Binding IsKeySet}" 
    Name="dgwTemplateDetails" CanUserAddRows="False" SelectionMode="Single" 
    ItemsSource="{Binding OrderTemplateList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    AutoGenerateColumns="False" Width="auto" FontWeight="Normal" FontStyle="Normal"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Act Code" Width="75" Binding="{Binding ActCode}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Act Name" Width="*" Binding="{Binding ActName}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="No. Of Days" Width="80" Binding="{Binding NoOfDays}"/> 
     <DataGridTemplateColumn Header="To be Finish Date" Width="110" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding EarStartDt, StringFormat=dd/MM/yyyy, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <DatePicker SelectedDate="{Binding EarStartDt, StringFormat=dd/MM/yyyy, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Act Status" Width="100" Binding="{Binding ActStatus}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Remarks" Width="200" Binding="{Binding Remarks}" IsReadOnly="True"/> 
    </DataGrid.Columns> 
</DataGrid> 

ответ

-5
ObservableCollection<object> orderTemplateList = new ObservableCollection<object>(); 
private bool toFilter; 
ObservableCollection<object> OrderTemplateList 
{ 
    get 
    { 
     if (toFilter) 
      return orderTemplateList.Where(c => c.Status = FilterStatus); 
     else 
      return orderTemplateList; 
    } 
} 
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    toFilter = !toFilter; 
    OnPropertyChanged("OrderTemplateList"); 
} 

ButtonClick будет ваша команда обработчик здесь

+1

Где возвращает IEnumerable, а не ObservableCollection: не может неявно преобразовывать тип 'System.Collections .Generic.IEnumerable 'to' System.Collections.ObjectModel.ObservableCollection '. Явное преобразование существует (вам не хватает роли?) –

12

Я хотел бы использовать ICollectionView для фильтрации.

public ICollectionView MyView {get; private set;} 

так в вашем CTOR вы можете сделать:

MyView = CollectionViewSource.GetDefaultView(OrderTemplateList); 
MyView.Filter = MyFilterAction; 

так, когда ваш "button_ClickCommand" установить новый статус в вашем ViewModel вы можете просто позвонить

MyView.Refresh(); 

и ваш фильтр будет переоценивать

Смежные вопросы