Фильтрация элементов из ListBox через TextBox - PullRequest
0 голосов
/ 29 сентября 2011

Привет, я создал список, который привязан к списку машин.Поскольку количество машин может резко возрасти, мне нужно как-то фильтровать по имени.По этой причине я предоставил TextBox, где пользователи могут ввести строку для фильтрации.Я подумал создать еще один список, который будет привязан к представлению, то есть второй список только для визуализации.Тем не менее, я думаю, что должен быть более чистый способ сделать это.

<ListBox  IsSynchronizedWithCurrentItem="True" Visibility="{Binding MachinesPanelVisibility}" 
                    ItemsSource="{Binding MachineRulesList}" SelectedIndex="{Binding ItemSelectionIndex}" />

 <TextBox HorizontalAlignment="Right" Width="162" Text="Filter..." TextWrapping="Wrap" Margin="0,44,18,13" />

В модели представления:

public class BusinessRulesWizardViewModel : INotifyPropertyChanged
    {

public ObservableCollection<string> MachineRulesList
     {
       get { return _machineRulesList; }
       set
          {
            _machineRulesList = value;
             OnPropertyChanged("MachineRulesList");
          }
      }



 public BusinessRulesWizardViewModel(ISystemView systemViewManager, 
       IEventAggregator eventAggregator)
    {
         _machineRulesList = new ObservableCollection<string>();
        _systemViewManager.GetMachines(page, pageSize).ToList().ForEach(
            item => _machineRulesList.Add(item)
         );
    }

1 Ответ

2 голосов
/ 29 сентября 2011

Использование может использовать интерфейс ICollectionView, чтобы обернуть вашу коллекцию со свойством Filter, установленным в предикат, который использует текст, введенный в TextBox. Вот пример:

<ListBox IsSynchronizedWithCurrentItem="True" Visibility="{Binding MachinesPanelVisibility}" 
         ItemsSource="{Binding MachineRulesListView}" 
         SelectedIndex="{Binding ItemSelectionIndex}" />   
<TextBox HorizontalAlignment="Right" Width="162" 
         Text="{Binding FilterText}" 
         TextWrapping="Wrap" Margin="0,44,18,13" />

-

public class BusinessRulesWizardViewModel : INotifyPropertyChanged
{

     public ObservableCollection<string> MachineRulesList
     {
       get { return _machineRulesList; }
       set
          {
            _machineRulesList = value;
             OnPropertyChanged("MachineRulesList");
          }
     }

     public string FilterText
     {
       get { return _filterText; }
       set
          {
            _filterText= value;
             OnPropertyChanged("FilterText");
            MachineRulesListView.Refresh();
          }
     }

     public ICollectionView MachineRulesListView { get; private set; }



    public BusinessRulesWizardViewModel(ISystemView systemViewManager, IEventAggregator eventAggregator)
    {
         _machineRulesList = new ObservableCollection<string>();
        MachineRulesListView = CollectionViewSource.GetDefaultView(_machineRulesList);
        MachineRulesListView.Filter = new Predicate<object>(r => ((string)r).Contains(FilterText));

        _systemViewManager.GetMachines(page, pageSize).ToList().ForEach(
            item => _machineRulesList.Add(item)
         );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...