Значение «Все» для фильтра данных Combobox в WPF - PullRequest
0 голосов
/ 23 июня 2011

Во время создания пользовательского контроля я заполняю комбинированный список некоторыми данными. Работает отлично. У меня Status.ID в качестве valuePath и Status.Name в качестве displayPath.

cmb.ItemsSource = dbEntities.Status

Comobox будет использоваться в качестве элемента управления фильтра, и мне нужно вставить некоторое значение для «All», которое будет использоваться в качестве пустого фильтра.

Сначала я попробовал забавное решение:

ObjectSet objectSet= dbEntities.Status;
Status stAll = new Status();
stAll.ID = -1;
stAll.Name = "All";
objectSet.AddObject(stAll);
cmb.ItemsSource = objectSet;

По какой-то причине объект не добавляется в набор объектов. Это не бросило никакого исключения либо.

Затем я попытался вставить его вручную в первый индекс, но получил ошибку: «Операция недопустима, когда ItemsSource используется. Получите доступ к элементам и измените их с помощью ItemsControl.ItemsSource». Мой код выглядел так:

cmb.ItemsSource = entities.Status;
cmb.Items.Insert(0,"All");

Оба не работали. Какой самый простой способ добавить эту строку в комбинированный список? Сообщение об ошибке запутало меня. Я не уверен, как использовать ItemsSource для таких целей.

edit: у меня не было достаточно представителей, чтобы ответить на мой собственный вопрос, так что вот рабочий код. Еще раз спасибо Крейгу.

CompositeCollection comp = new CompositeCollection();
comp.Add(new CollectionContainer {Collection = dbEntities.Status});
Status stAll = new Status();
stAll.ID = -1;
stAll.Name = "All";
comp.add(stAll);
cmb.ItemsSource = comp;
//do whatever filter you want when the selected value is -1

1 Ответ

1 голос
/ 23 июня 2011

Есть несколько разных проблем с тем, что вы пытаетесь сделать. Вы не можете манипулировать Items, когда используете ItemsSource, вместо этого вам нужно пройти через объект, который установлен на ItemsSource. Именно об этом и говорится во второй части сообщения об ошибке. Это потому, что когда вы устанавливаете ItemsSource, значение Items не используется, оно не заполняется значениями ItemsSource.

Я недостаточно знаком с классом ObjectSet, чтобы понять, почему первый случай не работает. Тем не менее, кажется неудобным добавлять элемент к вашим ценностям, которые вы извлекаете из другого места, просто для того, чтобы все было. Лучшее решение - использовать нулевое значение, чтобы ничего не представлять. К сожалению, в WPF нет встроенного способа сделать это. Тем не менее, есть довольно простое решение использовать адаптер сделать это. Я использовал это решение NullItemSelectorAdaptor , которое разрешает использовать NULL в качестве выделения, даже если NULL отсутствует в списке. Все, что вам нужно сделать, это обернуть ваш комбинированный список в NullItemSelectorAdapter, и значение NULL будет добавлено в качестве значения. В блоге все объясняется довольно четко, поэтому я не буду повторять это. Вы можете настроить свой фильтр так, чтобы нулевое значение равнялось отсутствию фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...