Связывание WPF DataGridComboBoxColumn с MVVM
Я просмотрел ответы на различные вопросы , но не смог отобразить контент в ответах на проблему, которую я пытаюсь решить. Я сводил его к следующему коду (представителю результата, которого я пытаюсь достичь), и в основном хочу иметь возможность отображать Person.TitleId
качестве соответствующего Title.TitleText
когда строка не редактируется, и правильно TitleText
чтобы он отображал TitleText
s в раскрывающемся TitleId
и записывал связанный TitleId
обратно в запись Person
когда он был изменен.
Короче говоря, что я поставил в свой для достижения этого?
App.xaml.cs
- Найти элемент WPF внутри DataTemplate в коде
- WPF XAML Bindings и CurrentCulture Display
- WPF TextBox Validation C #
- Можно ли выбрать текстовый блок WPF?
- Изменение цвета ячейки DataGrid на основе значений
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var viewModel = new ViewModels.MainWindowViewModel(); var mainWindow = new MainWindow(); mainWindow.DataContext = viewModel; mainWindow.ShowDialog(); }
MainWindow.xaml
Person.cs
public class Person { public int TitleId { get; set; } public string LastName { get; set; } public string FirstName { get; set; } }
Title.cs
public struct Title { public Title(int titleId, string titleText) : this() { TitleId = titleId; TitleText = titleText; } public string TitleText { get; private set; } public int TitleId { get; private set; } public static List GetAvailableTitles() { var titles = new List(); titles.Add(new Title(1, "Mr")); titles.Add(new Title(2, "Miss")); titles.Add(new Title(3, "Mrs")); return titles; } }
MainWindowViewModel.cs
public class MainWindowViewModel : ViewModelBase { private ObservableCollection contacts; private List titles; public MainWindowViewModel() { titles = Title.GetAvailableTitles(); Contacts = new ObservableCollection(); Contacts.Add(new Person() { FirstName = "Jane", LastName = "Smith", TitleId = 2 }); } public List Titles { get { return titles; } } public ObservableCollection Contacts { get { return contacts; } set { if (contacts != value) { contacts = value; this.OnPropertyChanged("Contacts"); } } } }
ViewModelBase.cs
public class ViewModelBase : INotifyPropertyChanged { protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; }
- Как связать WPF DataGrid с переменным числом столбцов?
- Есть ли способ определить, где объявляется / создается привязка WPF?
- Что означает «{Binding Path =.}» В привязке WPF?
- Удалить файл, используемый другим процессом
- Как SynchronizationContext.Current основного streamа становится нулевым в приложении Windows Forms?
- Конвертер связыванияПараметр
- Установите позицию курсора / курсора в конец текстового поля WPF с строковым значением
- В каких сценариях замораживание объектов WPF значительно повышает производительность?
Вот рабочий код. Ключевым моментом здесь было использование SelectedValueBinding
вместо SelecteItemBinding
.
@ Ответ SnowBear работал хорошо для меня. Но я хочу прояснить детали привязки.
В примере с @ Rob classы Title и Person используют TitleID. Поэтому в ответе @ SnowBear в привязке:
SelectedValueBinding="{Binding TitleId}"
мне не сразу стало ясно, какой class и собственность связаны.
Поскольку атрибут SelectedValueBinding появился на DataGridComboBoxColumn, он привязан к ItemsSource содержащего DataGrid. В этом случае коллекция контактов Person.
В моем случае коллекция DataSource DataGrid была отнесена к свойству, которое было названо иначе, чем ValuePath из коллекции ItemSource ComboBox. Таким образом, значение моего SelectedValueBinding было привязано к другому свойству, чем свойство, указанное в SelectedValuePath из ComboBox.