c# - DataGridComboBoxColumn ActionHandler

标签 c# wpf datagrid

我有一个包含动态创建的 DataGridComboBoxColumn 的 WPF,它有一个组合框,我可以更改任何行中的值。该表还在另一列中包含一个复选框,如果我更改它,每次更改行时它都会调用一个方法,当我更改组合框中的值时我希望得到相同的结果

我有一个 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 吗?

最佳答案

最终找到了方法。

首先,我将 RumStyles 列表添加到我的每个朗姆酒中,并使用一种方法将样式名称作为列表获取

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

然后我想出了以下代码来在 DataGridTemplateColumn 而不是 DataGridComboBoxColumn 中构建 ComboBox

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 来解决,即当第一次显示该行时,将调用组合框1_SelectionChanged。

关于c# - DataGridComboBoxColumn ActionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9363667/

相关文章:

c# - 如何从另一个 View 模型实例化和显示一个 ViewModel

c# - 如何在受密码保护的网络驱动器上使用 XDocument.load/save 方法?

wpf - MvvmCross:在另一个 View 中查看(或等效于CaliburnMicro Conductor)

c# - 允许在 dataGridview 中选择行但不允许选择单元格

c# - 如何将集合绑定(bind)到 WPF :DataGridComboBoxColumn

c# - 在 C# 中使用 Datagrid 更新数据库

c# - 在 C# LINQ 中使用 SQL LIKE 运算符

c# - Quartz.Net CronExpression 生成器

wpf - 在 TextBox/RichTextBox 中 block 选择

c# - IsChanged with IChangeTracking Not Firing on Window Close WPF MVVM C#