基于另一个 Combobox 以编程方式绑定 Datagrid 中 ComboBox 的值
Posted
技术标签:
【中文标题】基于另一个 Combobox 以编程方式绑定 Datagrid 中 ComboBox 的值【英文标题】:Programatically Binding the value of a ComboBox in a Datagrid based on another Combobox 【发布时间】:2021-08-01 03:00:21 【问题描述】:我有一个绑定到可观察集合的 DataGrid。在这个 DataGrid 中,我有两个组合框(在其他列中)。其中一列是任务,第二列是进度。 我想要实现的是第二个下拉列表(进度)的项目源,将根据第一个下拉列表(任务)的值进行更新。 这是我到目前为止所做的:
<Window.Resources>
<ObjectDataProvider x:Key="EngTaskEnum"
MethodName="GetValues"
ObjectType="x:Type core:Enum">
<ObjectDataProvider.MethodParameters>
<x:Type Type="Sources:EngTask"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<DataGrid x:Name="DataGrid_tbl"
ItemsSource="Binding"
AutoGenerateColumns="False"
AlternatingRowBackground="LightBlue"
CanUserAddRows="True"
CanUserResizeColumns="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
SelectionMode="Single"
CellEditEnding="DataGrid_tbl_CellEditEnding"
PreparingCellForEdit="DataGrid_tbl_PreparingCellForEdit">
<DataGrid.Columns>
<!--Task-->
<DataGridComboBoxColumn SelectedItemBinding="Binding EngTask"
ItemsSource="Binding Source=StaticResource EngTaskEnum"
Header="Task"
Width="Auto"
MinWidth="120"/>
上面显示的是(任务)栏,进度栏也是如此。这就是我在代码隐藏上尝试的:
private void DataGrid_tbl_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
if(e.Column.Header.ToString() == "Progress")
switch (_taskSelected)
case"Software":
e.EditingEventArgs.Source = Enum.GetValues(typeof(SoftProgress));
break;
case "Hardware":
e.EditingEventArgs.Source = Enum.GetValues(typeof(HardProgress));
break;
我几乎可以肯定,这很可能不是正确的方法,但我一直在尝试找出不同的方法,看看哪些方法可行。请如果有人可以提供一些输入将不胜感激。 谢谢!
【问题讨论】:
【参考方案1】:您应该将第二个ComboBox
绑定到定义EngTask
属性的类的IEnumerable
属性。
设置EngTask
时(当您在第一个ComboBox
中选择一个值时会发生这种情况),您将IEnumerable
属性设置为要在第二个ComboBox
中显示的项目。
确保实现INotifyPropertyChanged
接口并为模型类中的IEnumerable
属性引发PropertyChanged
事件(其中定义了EngTask
)。
【讨论】:
你好@mm8 我尝试了你的建议。我还没有真正使用过 INotifyPropertyChanged,所以我不完全确定我所做的是否正确,但似乎在我完成该行之前没有设置 EngTask。从我观察到的行为来看,一旦您单击数据网格,它会创建一个新项目,然后进入类并获取所有属性,一旦您单击行外,该项目就会被添加到集合中并开始设置这些属性(如果有意义的话)。基本上在创建行时,EngTask 为空,直到用户尝试创建另一行 可以设置UpdateSourceTrigger
立即设置源属性:SelectedItemBinding="Binding EngTask, UpdateSourceTrigger=PropertyChanged"
以上是关于基于另一个 Combobox 以编程方式绑定 Datagrid 中 ComboBox 的值的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式从viewmodel中选择listview项?
c#winform中一个combobox的datasource绑定给另一个combobox
将 ComboBox 文本绑定到另一个 ComboBox 内的 ValidationRule?