powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / C# WPF MVVM Editable Combobox in DataGrid
11 сообщений из 11, страница 1 из 1
C# WPF MVVM Editable Combobox in DataGrid
    #38753566
Cuguyc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Никак не получается сделать редактируемый Combobox в DataGrid'е. Точнее заставить его работать правильно.
Задача:
Создать редактируемый Combobox в DataGrid.
При нажатии должен открываться выпадающий список.
При вводе текста нужно чтобы выпадающий список сокращался в зависимости от введенных значений.
Что бы была возможность как выбирать из выпадающего списка так и вводить значение полностью.

И так, что я сделал и что у меня не работает:

Код XAML представления:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<UserControl.Resources>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="StaysOpenOnEdit" Value="True"/>
        </Style>
</UserControl.Resources>

                    <DataGridTemplateColumn MinWidth="100" Header="Валюта" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                        <ComboBox   ItemsSource="{Binding Path=Currences}"
                                    SelectedItem="{Binding DataContext.SelectedCurrency, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                    IsTextSearchEnabled="False"
                                    IsEditable="True"
                                    DisplayMemberPath="CurrencyVal"
                                    Text="{Binding DataContext.Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}">
                                   
                                    <ComboBox.Style>
                                        <Style TargetType="ComboBox">
                                            <Style.Triggers>
                                                <MultiTrigger>
                                                    <MultiTrigger.Conditions>
                                                        <Condition Property="IsKeyboardFocusWithin" Value="true"/>
                                                    </MultiTrigger.Conditions>
                                                    <MultiTrigger.Setters>
                                                        <Setter Property="IsDropDownOpen" Value="True" ></Setter>
                                                    </MultiTrigger.Setters>
                                                </MultiTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </ComboBox.Style>                                    
                                </ComboBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>




MultiTrigger - помогает открывать выпадающий список по фокусу на комбо бокс
В ресурсах соответственно не дает выпадающему списку закрыться при вводе
SelectedItem привязка к коллекции
Text привязка к свойству

Код ViewModel


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
//В конструкторе
var notes = OfficialNoteMain.OfficialNote;
            if (notes == null)
            {
                OfficialNoteCollection = new ObservableCollection<OfficialNote> { OfficialNote };
            }
            else
            {
                if (!notes.Any())
                {
                    notes.Add(OfficialNote);
                }
                OfficialNoteCollection = new ObservableCollection<OfficialNote>();
                foreach (var item in notes)
                {
                    item.Currency = SelectedCurrency;
                    item.Currences = Currences;
                    OfficialNoteCollection.Add(item);
                }
            }
//Конец конструктора

private ObservableCollection<Currency> _currencies;
        public ObservableCollection<Currency> Currences // Коллекция валют 
        {
            get { return _currencies ?? (_currencies = new ObservableCollection<Currency>(_repository.GetAllItems<Currency>())); }
        }

public string Text 
        {
            get
            {
                if (SelectedCurrency != null)
                    return SelectedCurrency.CurrencyVal;
                else
                {
                    return null;
                }
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    Currences.Clear();
                    foreach (var item in _repository.GetFirstItemsPredicate<Currency>(20).Where(x => x.CurrencyVal != null).Where(z => z.CurrencyVal.ToLower().Contains(value.ToLower())))
                        Currences.Add(item);

                    if (_repository.GetAllItems<Currency>().FirstOrDefault(x => x.CurrencyVal.Contains(value)) != null)
                        SelectedCurrency = _repository.GetAllItems<Currency>().First(x => x.CurrencyVal.Contains(value));
                }
            } 
        }

        private Currency _currency;

        public Currency SelectedCurrency
        {
            get
            {
                return _currency;
            }
            set
            {
                _currency = value;
            }
        }




В моделе только:

Код: c#
1.
public ObservableCollection<Currency> Currences { get; set; }




Весь код не выкладывал, там много лишнего, постарался выложить по максимуму.

Проблема в том, что данные не записываются в бд.
Если забиндить только SelectedItem, то в принципе работает но если вводишь текст то естественно не сохраняется. Сохраняется только если выбрал из выпадающего списка. Ну и выпадающий список конечно же не сокращается.

В свойства по сути заходит, так что проблема не в привязке.
коллекция сокращается при вводе, выпадающий список открывается, это работает.
Сохранение в базу тоже работает, тут скорее дело в той ереси, что я написал внутри свойств SelectedCurrency и Text.
Для работы с бд использую LinqToSQL, класс модели, это партикл класс таблицы грубо говоря.

Пожалуйста помогите разобраться, может кто сталкивался с проблемой?

P.S. Прошу сильно палками не бейте сам знаю, что много "гомнокода" написал.
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #38753651
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #38753660
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #38754227
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<TextBox> + <Popup> всё, что душе угодно
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #38755200
Cuguyc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes <TextBox> + <Popup> всё, что душе угодно

Хммм... интересно, правда я с popup почти не работал

Пока что не совсем понимаю, если в
Код: xml
1.
2.
3.
<DataGridTemplateColumn MinWidth="100" Header="Валюта" >
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>


вставлять и <TextBox> и <Popup> он начинает ругаться на то, что св-во visual tree установлено больше 1 раза.

В принципе идея интересная, как я понял надо в popup запихнуть listbox, его прибиндить к коллекции + по нажатию на элемент listbox выводить этот элемент в поле текст бокса, ещё надо наверное скрол вставить.
С текст боксом по сути проще работать, у меня есть текстовая колонка, она отлично отрабатывает но она не через DataTemplate работает, хотя думаю это особой роли не играет.
Код: c#
1.
<DataGridTextColumn     Width="*"     Header="Сумма" Binding="{Binding Path=Sum, StringFormat={}{0:0.00}}"/>


Теперь трабла собственно в том, что бы popup с textbox'ом как-то заставить вместе работать)
Не совсем понимаю как это всё сделать в датагриде...
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #38755592
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CuguycНе совсем понимаю как это всё сделать в датагриде...Я же дал ссылки на рабочий пример. Там всё это есть, и TextBox, и Popup, и всё остальное.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
C# WPF MVVM Editable Combobox in DataGrid
    #39118240
xela17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К Описание: "Ввод значений по классификатору"

Исходники: SearchTextBox

Алексей, что случилось с ваши сайтом? Хотел воспользоваться ссылками, а в ответ тишина. Будьте добры ответьте пожалуйста, или сорцы на мыло alexela2@narod.ru
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #39120180
xela17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, поделитесь, пожалуйста сорцами, у кого осталось с сайта ss-pro.ru
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #39120197
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xela17Народ, поделитесь, пожалуйста сорцами, у кого осталось с сайта ss-pro.ru
да такой список делается за 5 минут на коленке, в чем проблема то?
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #39120378
xela17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Да мне не список нужен, а controlы посмотреть оттуда, да и вообще как все написано
...
Рейтинг: 0 / 0
C# WPF MVVM Editable Combobox in DataGrid
    #39120421
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xela17Roman Mejtes,

Да мне не список нужен, а controlы посмотреть оттуда, да и вообще как все написано
создаешь новый контрол, наследуешь его от TextBox, копируешь шаблон TextBox'а, потом в шаблон добавляешь Popup с ListBox'ом, задаешь DP для набора элементов и обрабатываешь кнопки Up\Down для перемещения по списку (чтоб можно было выбрать значение не выходя из TextBox'а. Для фильтрации значений используешь ICollectionView, фильтруешь по StartWith или Contains.
профит
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / C# WPF MVVM Editable Combobox in DataGrid
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]