У меня есть столбец DataGrid ComboBox, который привязан к наблюдаемой коллекции объектов ComboBoxOption, эти объекты просто содержат 2 значения, одно из которых является значением, отображаемым для пользователя, а другое — требуемым значением. Я устанавливаю привязки и т. д. во время события AutoGenerating Columns, и все это работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить поле со списком отображать только требуемое значение. Это невозможно сделать в XAML (если только я не смогу настроить шаблон столбца в XAML и использовать его в коде позади), потому что столбцы таблицы и т. д. не определены в XAML, поскольку сетка данных работает с коллекциями различных объектов и столбцов и т. д. настраиваются во время событий автоматического создания столбцов. Я попытался настроить это, используя стиль ячейки столбца, но я не могу заставить его работать. может ли кто-нибудь указать мне в правильном направлении
урезанный код:
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
comboBoxColumn.ItemsSource = (DataContext as vm_DataTable).DataGridComboBoxColumnOptions; //// The item source is in the View Model (An Observable Collection of ComboBoxOptions)
Binding comboBoxSelectionBinding = new Binding("ComboBoxSelectedItem"); //// Bind the selected item to the ComboBoxOption "ComboBoxSelectedItem" Getter/Setter in the Model
comboBoxSelectionBinding.Mode = BindingMode.TwoWay;
comboBoxSelectionBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
comboBoxColumn.SelectedValueBinding = comboBoxSelectionBinding;
e.Column = comboBoxColumn;
Style comboBoxCellStyle = new Style { TargetType = typeof(DataGridCell) };
comboBoxCellStyle.Setters.Add(new Setter(ComboBox.DisplayMemberPathProperty, "DisplayedValue"));
e.Column.CellStyle = comboBoxCellStyle;
}
Решение: (мне в правильном направлении указал пост @heliar)
Класс ComboBoxOption:
class ComboBoxOption : INotifyPropertyChanged
{
private string requiredValue = "";
private string displayedValue = "";
public string RequiredValue
{
get { return this.requiredValue; }
set
{
this.requiredValue = value;
OnPropertyChanged("requiredValue");
}
}
public string DisplayedValue
{
get { return this.displayedValue; }
set
{
this.displayedValue = value;
OnPropertyChanged("displayedValue");
}
}
public ComboBoxOption(string RequiredValue, string DisplayedValue)
{
this.requiredValue = RequiredValue;
this.displayedValue = DisplayedValue;
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
В коде для представления:
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
comboBoxColumn.ItemsSource = (DataContext as vm_DataTable).DataGridComboBoxColumnOptions; //// The item source is in the View Model/Data Context (An Observable Collection of ComboBoxOptions)
Binding comboBoxSelectionBinding = new Binding("ComboBoxSelectedItem"); //// Bind the selected item to the ComboBoxOption "ComboBoxSelectedItem" Getter/Setter in the Model
comboBoxSelectionBinding.Mode = BindingMode.TwoWay;
comboBoxSelectionBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
comboBoxColumn.SelectedValueBinding = comboBoxSelectionBinding;
comboBoxColumn.SelectedValuePath = "RequiredValue"; // RequiredValue is the ComboBoxOption Getter/Setter for this field, (this is the value that the record contains for this column)
comboBoxColumn.DisplayMemberPath = "DisplayedValue"; // DisplayedValue is the ComboBoxOption Getter/Setter for this field
e.Column = comboBoxColumn;
}
не уверен, что привязка выбранного значения потребуется в большинстве случаев, но в моем случае мне иногда нужен доступ как к отображаемым, так и к требуемым значениям :)