DataGridComboBoxColumn ActionHandler - PullRequest
       0

DataGridComboBoxColumn ActionHandler

1 голос
/ 20 февраля 2012

У меня есть WPF, содержащий динамически созданный DataGridComboBoxColumn, у него есть comboBox, в котором я могу изменить значение в любой строке. В таблице также есть флажок в другом столбце. Если я изменяю его, он вызывает метод каждый раз, когда изменяется строка, я хочу получить тот же результат при изменении значения в выпадающем списке

У меня есть список моих объектов Rum, для которых есть три метода

public int rumStyle { get; set; }
public string rumStyleDesc { get; set; } // string representation  of ruymStyle
public bool rumIsValid { get; set; }

Эта часть флажка работает

DataGridTemplateColumn textColumnValid = new DataGridTemplateColumn();
textColumnValid.Header = headerRumIsValid;
FrameworkElementFactory checkBoxFactory = new FrameworkElementFactory(typeof(CheckBox));
Binding rumIsValidBinding = new Binding("rumIsValid");
checkBoxFactory.SetValue(CheckBox.IsCheckedProperty, rumIsValidBinding);
checkBoxFactory.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(LostFocus));
DataTemplate rumIsdValidTemplate = new DataTemplate();
rumIsdValidTemplate.VisualTree = checkBoxFactory;
textColumnValid.CellTemplate = rumIsdValidTemplate;
_dgData.Columns.Add(textColumnValid);

Эта часть отображает комбинированный список в каждой строке, но я хочу, чтобы он вызывал LostFocus (или другой метод) при изменении выбора.

DataGridComboBoxColumn comb = new DataGridComboBoxColumn();
comb.Header = headerRumStyle;
comb.SelectedValueBinding = new Binding("rumStyleDesc");
comb.ItemsSource = _rumStyles.getRumStyleNames();
FrameworkElementFactory comboFactory = new FrameworkElementFactory(typeof(ComboBoxItem));
comboFactory.SetValue(ComboBox.SelectedItemProperty, new Binding("rumStyleDesc"));
comboFactory.AddHandler(ComboBox.SelectionChangedEvent, 
new SelectionChangedEventHandler(comboBox1_SelectionChanged));
DataTemplate comboboxTemplate = new DataTemplate();
comboboxTemplate.VisualTree = buttonFactory;
// How do I do this part 
// comb.CellTemplate = comboboxTemplate;
_dgData.Columns.Add(comb);

Второй, но менее важный вопрос: могу ли я отобразить rumStlyeDesc в выпадающем списке, но каким-то образом прочитать rumstyleId.

1 Ответ

1 голос
/ 21 февраля 2012

В конце концов нашел, как это сделать.

Сначала я добавил список RumStyles к каждому из моих ромов с помощью метода для получения имен стилей в виде списка

public RumStyles rumStyles { get; set; }
public List<string> rumStlyesList{ get {return rumStyles.getRumStyleNames();}}

Затем я придумалследующий код для создания ComboBox в DataGridTemplateColumn, а не в DataGridComboBoxColumn

DataGridTemplateColumn changeRumStyleColumn = new DataGridTemplateColumn();
changeRumStyleColumn.Header = headerRumStyle;
FrameworkElementFactory styleComboFactory = 
    new FrameworkElementFactory(typeof(ComboBox));
Binding selectedStyle = new Binding("rumStyleDesc");
styleComboFactory.SetBinding(ComboBox.ItemsSourceProperty,
    new Binding("rumStlyesList"));
styleComboFactory.SetBinding(ComboBox.SelectedItemProperty, new Binding("rumStyleDesc"));
styleComboFactory.SetValue(ComboBox.SelectedItemProperty, selectedStyle);
styleComboFactory.AddHandler(ComboBox.SelectionChangedEvent, 
new SelectionChangedEventHandler(comboBox1_SelectionChanged));
DataTemplate rumStyleTemplate = new DataTemplate();
rumStyleTemplate.VisualTree = styleComboFactory;
changeRumStyleColumn.CellTemplate = rumStyleTemplate;
_dgData.Columns.Add(changeRumStyleColumn);

Осталась одна проблема, которая может быть исправлена ​​путем изменения SelectionChangedEvent, то есть при каждом первом отображении строки вызывается comboBox1_SelectionChanged,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...