2009-04-08 4 views
0

Сначала код (извините, если его не 100%) Я не эксперт, и тогда вопрос следует.Сохранять список выбора товаров

public partial class Window1 : Window 
    { 
    CollectionView cv; 

    public Window1() 
    { 
     InitializeComponent(); 

     List<Person> ppl = new List<Person>(); 
     BitmapImage b = new BitmapImage(new Uri(@"http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png",UriKind.Absolute)); 
     ppl.Add(new Person(b, "world1")); 
     ppl.Add(new Person(b, "world2")); 
     ppl.Add(new Person(b, "world3")); 
     ppl.Add(new Person(b, "world4")); 
     ppl.Add(new Person(b, "world5")); 
     ppl.Add(new Person(b, "world6")); 

     lb.ItemsSource = ppl; 
     lb.SelectedIndex = 1; 

     cv = (CollectionView)CollectionViewSource.GetDefaultView(lb.ItemsSource); 

     new TextSearchFilter(cv, textBox1); 
    } 
} 

public class TextSearchFilter 
{ 
    public TextSearchFilter(CollectionView cv, TextBox tb) 
    { 
     string filterText = ""; 

     cv.Filter = delegate(object obj) 
     { 
      Person p = obj as Person; 
      int index = p.Info.IndexOf(filterText,0,StringComparison.InvariantCultureIgnoreCase); 
      return index > -1; 
     }; 

     tb.TextChanged += delegate 
     { 
      filterText = tb.Text; 
      cv.Refresh(); 
     }; 
    } 
} 

    class Person 
    { 
     private BitmapImage myImage; 
     private string myInfo = ""; 

     public BitmapImage Image 
     { 
      get { return myImage; } 
      set { myImage = value; } 
     } 

     public string Info 
     { 
      get { return myInfo; } 
      set { myInfo = value; } 
     } 

     public Person(BitmapImage Image, string Info) 
     { 
      this.Image = Image; 
      this.Info = Info; 
     } 
    } 

Спасибо за чтение до сих пор, как вы поняли бы теперь, что код фильтрует ListBox на основе ввода в текстовом поле, которое работает как шарм кстати.

Моя проблема заключается в том, как сохранить выбор во время фильтрации. Когда окно загружается, в списке есть все элементы в нем, и я выбираю первый элемент, затем я ввожу что-то в текстовое поле и фильтры списка, чтобы показывать только соответствующие элементы, после выбора другого элемента я удаляю весь текст из текста который возвращает его в исходное состояние, но на этот раз выбор изменился только на элемент, который я выбрал в отфильтрованном виде (поэтому вместо двух элементов, которые отображаются как выбранные, только один отображается как выбранный). Такое поведение очевидно, поскольку я фильтрую коллекцию, поэтому в момент изменения коллекции выбор теряется.

Есть ли способ сохранить выбор? любые указатели?

Большое спасибо.

ответ

1

Возможно в обработчике событий TextChanged, вы должны сохранить выбранные элементы в ListBox, как и так:

Person[] selectedPeople = new Person[lb.SelectedItems.Count]; 
lb.SelectedItems.CopyTo(selectedPeople, 0); 

Затем после обновления фильтра, добавить их обратно с помощью:

foreach (Person p in selectedPeople) 
{ 
    if(lb.Items.Contains(p)) 
    { 
     lb.SelectedItems.Add(p); 
    } 
} 

причина, почему я используйте его с помощью CopyTo и сохраните в массиве вместо того, чтобы просто использовать:

IList selectedPeople = lb.SelectedItems; 

заключается в том, что последний просто сохранит ссылку на lb.SelectedItems, и foreach изменит перечисление, вызывая исключение. Там может быть более простой способ, но это должно заставить вас идти в правильном направлении.

0

Я полагаю, что фильтр будет вставлять, удалять и переупорядочать элементы в наблюдаемой коллекции. Когда он временно удаляет, чтобы вставить его в другое место, WPF преждевременно устанавливает значение SelectedItem равным null. Затем, когда вы добавите его обратно, он не будет выбран.

Вот обходной путь в форме поведения, которое вы можете прикрепить к своему списку.

http://www.codeproject.com/Tips/802806/Preserve-the-Selected-Item-of-a-WPF-List-Box

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