基于另一个 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

在 ListView 内显示绑定 ComboBox

将 ComboBox 文本绑定到另一个 ComboBox 内的 ValidationRule?

以编程方式 ComboBox VirtualizingStackPanel WPF

以编程方式设置 Combobox.Selected,但我无法显示选择