2017-01-23 7 views
0

Я борюсь с фильтрацией listView. Я попробовал 2 метода для фильтрации без удаления выбранных элементов. Моя проблема: всякий раз, когда выбранный элемент исчезает из-за фильтра, он больше не выбирается, когда он возвращается. Мои методы:WPF-фильтрация ListView удаляет выбранные элементы

Само написанный код:

  try 
     { 

      string s = isci_tb.Text; 
      if (isci_tb.Text == "") 
      { 
       osebe_listView.Items.Clear(); 
       foreach (Oseba o in seznamOseb) 
       { 
        osebe_listView.Items.Add(o); 
       } 
      } 
      else 
      { 
       osebe_listView.Items.Clear(); 
       foreach (Oseba o in seznamOseb) 
       { 
        if (contejns(o.ime, s) || contejns(o.priimek, s) || contejns(o.mobilnaSt.ToString(), s) || contejns(o.posta, s) || contejns(o.nazivPodjetja, s) || contejns(o.stacionarnaSt.ToString(), s) || contejns(o.naslov, s) || contejns(o.eMail, s)) 
        { 
         osebe_listView.Items.Add(o); 
        } 
       } 
      } 
     } 
     catch { } 

Что это делает он ищет все элементы и Потазывает только один, который соответствует с его фильтрации, но этот метод удаляет элементы comepletly и повторно добавляет их. Я попытался добавить значение для выбранных элементов, которое сохраняет onSelectionChanged и используется, когда фильтр изменен, но он не работает.

Второй способ был от this tutorial. Я надеялся, что это сработает, потому что оно использует фильтр, но, по-видимому, у него такая же проблема.

ответ

0

Вы можете попробовать установить Visibility ваших ListViewItems в зависимости от свойства Oseba. Тогда вместо

osebe_listView.Items.Clear(); 
foreach (Oseba o in seznamOseb) 
{ 
    if (someConditions) 
    { 
     osebe_listView.Items.Add(o); 
    } 
} 

Вы могли бы написать что-то вроде этого:

foreach (Oseba o in seznamOseb) 
{ 
    if (someConditions) // when true, we want to hide the object 
    { 
     o.IsVisible = false; 
    } 
} 

и в вашем файле .xaml использовать DataTemplate, который устанавливает позицию элемента Visibility в Collapsed когда IsVisible установлен в ложь.

Другой подход состоял в том, чтобы сохранить IsSelected -state внутри вашего объекта Oseba, чтобы при удалении и повторной добавке объекта в listView состояние выбора было постоянным.

+0

Как я могу установить свойство o.isVisible, если в Oseba его нет? Я думаю, вы хотите установить объекты с не равным фильтром в visible = false, правильно? Как я мог это сделать? Я пытаюсь это прямо сейчас – someone1

+0

Я был в предположении, что у вас есть контроль над классом «Oseba» и вы можете определить свойство IsVisible на нем. – mbger

+0

Oseba - это только класс данных, который имеет свойства, которые отображаются в ListView. – someone1

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