Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / C# WPF MVVM Editable Combobox in DataGrid / 11 сообщений из 11, страница 1 из 1
22.09.2014, 14:52
    #38753566
Cuguyc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
Добрый день.
Никак не получается сделать редактируемый 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
22.09.2014, 15:59
    #38753651
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
...
Рейтинг: 0 / 0
22.09.2014, 16:02
    #38753660
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
...
Рейтинг: 0 / 0
23.09.2014, 09:17
    #38754227
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
<TextBox> + <Popup> всё, что душе угодно
...
Рейтинг: 0 / 0
23.09.2014, 19:49
    #38755200
Cuguyc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
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
24.09.2014, 09:31
    #38755592
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
CuguycНе совсем понимаю как это всё сделать в датагриде...Я же дал ссылки на рабочий пример. Там всё это есть, и TextBox, и Popup, и всё остальное.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.12.2015, 12:34
    #39118240
xela17
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# WPF MVVM Editable Combobox in DataGrid
Алексей К Описание: "Ввод значений по классификатору"

Исходники: SearchTextBox

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

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

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


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