Сохранить список элементов списка - PullRequest
0 голосов
/ 08 апреля 2009

Сначала код (извините, если не на 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;
        }
    }

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

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

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

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2009

Возможно, в вашем обработчике событий 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 голосов
/ 01 августа 2014

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

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

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

...