В ячейках WPF Datagrid DataGridComboBoxColumn отображается значение, установленное во время события AutoGeneratingColumn

У меня есть столбец 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;
         }

не уверен, что привязка выбранного значения потребуется в большинстве случаев, но в моем случае мне иногда нужен доступ как к отображаемым, так и к требуемым значениям :)


person stuicidle    schedule 27.07.2017    source источник