| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > C# WPF MVVM Editable Combobox in DataGrid |
| Автор: Cuguyc 22.9.2014, 18:45 | ||||||
| Добрый день. Никак не получается сделать редактируемый Combobox в DataGrid'е. Точнее заставить его работать правильно. Задача: Создать редактируемый Combobox в DataGrid. При нажатии должен открываться выпадающий список. При вводе текста нужно чтобы выпадающий список сокращался в зависимости от введенных значений. Что бы была возможность как выбирать из выпадающего списка так и вводить значение полностью. И так, что я сделал и что у меня не работает: Код XAML представления:
MultiTrigger - помогает открывать выпадающий список по фокусу на комбо бокс В ресурсах соответственно не дает выпадающему списку закрыться при вводе SelectedItem привязка к коллекции Text привязка к свойству Код ViewModel
В моделе только:
Весь код не выкладывал, там много лишнего, постарался выложить по максимуму. Проблема в том, что данные не записываются в бд. Если забиндить только SelectedItem, то в принципе работает но если вводишь текст то естественно не сохраняется. Сохраняется только если выбрал из выпадающего списка. Ну и выпадающий список конечно же не сокращается. В свойства по сути заходит, так что проблема не в привязке. коллекция сокращается при вводе, выпадающий список открывается, это работает. Сохранение в базу тоже работает, тут скорее дело в той ереси, что я написал внутри свойств SelectedCurrency и Text. Для работы с бд использую LinqToSQL, класс модели, это партикл класс таблицы грубо говоря. Пожалуйста помогите разобраться, может кто сталкивался с проблемой? P.S. Прошу сильно палками не бейте сам знаю, что много "гомнокода" написал. |
| Автор: Ilya81 23.9.2014, 10:26 |
| Что ComboBox всё ж открывается, даже интересно, обычно я его помещаю в CellEditingTemplate, а не в CellTemplate. Но если setter свойства вызывается, то WPF не связан с сохранением в БД (ибо WPF только вызывает setter указанного в binding свойства). Обновление ObservableCollection точно не приведёт к записи в БД, для этого нужно вызвать методы Attach и Add у DbSet, а потом SaveChanges у DbContext. Запись в БД рекомендую делать не в UI-потоке. |
| Автор: Cuguyc 23.9.2014, 20:33 | ||||
| Я наверное не правильно написал, в базу всё записывается, но у меня путаница с привязкой текста и selectedItem'a. Вот очередная попытка сделать чтоб всё работало: код модели:
Код представления:
Я уже что только не пробую... Текст биндится и заходит в поле. Выбранный элемент тоже биндится и заходит в поле и список тоже но всё вместе отрабатывает не правильно Тут я явно косячу в геттерах и сеттерах текста и выбранного элемента, я путаюсь и не понимаю как сделать правильно. Мне надо, чтоб и вводимый текст мог добавляться и выбранный элемент, при всём при этом что бы выбранный элемент нормально отображался. Бывает, что я пишу текст, не дописал, выбираю из списка и всё пропадает к примеру и куча таких мелких косяков и в итоге не корректно работает. В базу добавление нормально отрабатывает, у меня есть проверочная текстовая колонка, там всё норм, комбо бокс тоже добавляется по сути... Добавлено через 3 минуты и 51 секунду Вот кажется, ну задача не из сверхфантастических, просто в таблице должен быть редактируемый комбо бокс с сокращающимся при вводе выпадающим списком, что бы можно было и в ручную полностью записать значение и выбрать... Но не получается как-то... Конечно я не гуру wpf программирования, но я думал что подобная задача не должна составить проблем, однако видимо ошибся. |
| Автор: Ilya81 24.9.2014, 11:19 |
| Стало понятнее, о чём речь. Попробуйте у ComboBox задать значение SelectedValuePath равным "CurrencyVal" (в XAML'е) и поставить binding для свойства SelectedValue (вместо SelectedItem) на строковое свойство. |