如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?

Posted

技术标签:

【中文标题】如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?【英文标题】:How to set the enable property of a programmatically generated ComboBox in a Datagrid in WPF ? 【发布时间】:2018-01-30 16:36:25 【问题描述】:

在 WPF 中,我有一个有 2 列的 Datagrid。 第一个是字符串,第二个是组合框。 我的目标是在组合框的属性 IsEnable 每次包含第 1 列的字符串时设置为 false。

我的数据源来自数据视图(其他一些列需要动态生成)。

我想解决方案必须围绕“绑定”值,但是...我不知道在里面放什么...有什么想法吗?

DataView DG = FunctionCreatingADataView();
Datagrid1.ItemsSource = DG;
Datagrid1.AutoGenerateColumns = true;
Datagrid1.Items.Refresh();

DataGridTemplateColumn dgTemplateColumn = new DataGridTemplateColumn();
dgTemplateColumn.Header = "Attachment";
var newCombobox = new FrameworkElementFactory(typeof(ComboBox));
newCombobox.SetValue(ComboBox.NameProperty, "myCBB");

Binding enableBinding = new Binding();
enableBinding.Source = "HasAttachment";// A column in my DG
enableBinding.Mode = BindingMode.OneWay;
newCombobox.SetValue(ComboBox.IsEnabledProperty, enableBinding);

List<string> listUnitAlreadyAttached = new List<string>();
// Load list with some code

enableBinding.Source = listUnitAlreadyAttached;
newCombobox.SetBinding(ComboBox.ItemsSourceProperty, enableBinding);

var dataTplT = new DataTemplate();
dataTplT.VisualTree = newCombobox;
dgTemplateColumn.CellTemplate = dataTplT;
Binding bindingIsEnable = new Binding();

Datagrid1.Columns[1] = dgTemplateColumn;

【问题讨论】:

你已经写了你的条件:我的目标是在组合框的属性 IsEnable 每次包含第 1 列的字符串时设置为 false。 写一个@987654322 @ 并将此转换器绑定到列中的字符串和组合框值。另一个提示:为什么要在后面的代码中这样做?在 xaml 中进行操作更容易阅读。 感谢您添加 Mighty。我选择以编程方式编写此内容,因为我还有其他动态创建的列(可能有 2 到数千个......),在 XAML 中看起来很复杂。 欢迎您。如果您在实施过程中遇到困难,我可以为您提供帮助。 我会看一下multiValueConverter,但假设我对xaml和wpf不熟悉,希望不会太复杂。 好吧,我放弃了,欢迎您的实施 :) 实际上,我不明白为什么 MultiValueConverter :根据组合框的所有项目的事实,只有字符串会启用或禁用组合框到处都是一样的。其他问题,如何指示“第一行第一列的字符串将更新第一行的组合框,而不是第二行?”明白了吗 ?迷路了…… 【参考方案1】:

您应该将BindingPath 设置为HasAttachment

newCombobox.SetValue(ComboBox.IsEnabledProperty, new Binding("HasAttachment"));

您可能希望使用转换器将值从true 转换为false

newCombobox.SetValue(ComboBox.IsEnabledProperty, new Binding("HasAttachment")  Converter = new InverseBooleanConverter() );

How to bind inverse boolean properties in WPF?

【讨论】:

你应该加一个IValueConverter(bool到相反的bool)因为他说如果HasAttachment设置为true,Combobox必须是Disable,如果它HasAttachment设置为false,ComboBox必须启用

以上是关于如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVVM 应用程序在 WPF 中以编程方式设置 DataGrid 的选定项?

如何对 WPF DataGrid 进行分页?

WPF DataGrid - 从 DataGrid ItemsSource 对象的集合值中设置唯一的每行(对象)组合框值

以编程方式将列和行添加到 WPF Datagrid

以编程方式 WPF DataGrid 行双击事件

wpf:DataGrid 禁用选定的行样式 - 或行选择