Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2014, 17:10   #1
Famine
Новичок
Джуниор
 
Регистрация: 07.08.2014
Сообщений: 2
По умолчанию C# WPF MVVM Editable Combobox in DataGrid

Добрый день.
Никак не получается сделать редактируемый Combobox в DataGrid'е. Точнее заставить его работать правильно.
Задача:
Создать редактируемый Combobox в DataGrid.
При нажатии должен открываться выпадающий список.
При вводе текста нужно чтобы выпадающий список сокращался в зависимости от введенных значений.
Что бы была возможность как выбирать из выпадающего списка так и вводить значение полностью.

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

Код XAML представления:
Код:
<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 привязка к свойству
Famine вне форума Ответить с цитированием
Старый 22.09.2014, 17:11   #2
Famine
Новичок
Джуниор
 
Регистрация: 07.08.2014
Сообщений: 2
По умолчанию

Код ViewModel


Код:
//В конструкторе
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;
            }
        }


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

Код:
public ObservableCollection<Currency> Currences { get; set; }

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

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

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

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

P.S. Прошу сильно палками не бейте сам знаю, что много "гомнокода" написал.
Famine вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенный биндинг MVVM WPF Egoist42 WPF, UWP, WinRT, XAML 0 29.08.2014 07:37
DataGrid WPF Brodish C# (си шарп) 0 06.01.2013 15:42
Комманды и ICommand в WPF MVVM andy301086 WPF, UWP, WinRT, XAML 0 09.07.2012 01:04
WPF контекстное меню для ListBox MVVM Нике WPF, UWP, WinRT, XAML 0 29.04.2012 15:26
WPF LisBox Selectionchanged to MVVM Нике WPF, UWP, WinRT, XAML 0 10.04.2012 22:31