将 List 中的数据放入 DataGrid ComboBox

Posted

技术标签:

【中文标题】将 List 中的数据放入 DataGrid ComboBox【英文标题】:Getting data in List into DataGrid ComboBox 【发布时间】:2021-12-29 21:44:06 【问题描述】:

我在 WPF 的数据网格中将项目从列表中获取到组合框列时遇到问题。这对我来说是新的,所以任何帮助将不胜感激。似乎有很多方法可以做到这一点,但我无法让其中任何一种工作。

'''

                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="Binding Positionname"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>

                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="poscombo Loaded="comboposloaded"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            
            </DataGridTemplateColumn>

在后面的代码中列出数据

 List<Positions> PositionList = new List<Positions>();

更新: 我最终添加了一个加载事件以将列表作为 itemsource 拉取。现在的问题是如何将组合框中的选定值返回到文本块中?

添加 C# 以加载组合。

    private void comboposloaded(object sender, RoutedEventArgs e)
    
        ComboBox cmb = (ComboBox)sender;
        cmb.ItemsSource = PositionList;
        cmb.DisplayMemberPath = "info";
        cmb.SelectedValuePath = "psnme";

    

【问题讨论】:

使用数据绑定。看我的回答。 【参考方案1】:

现在的问题是如何将组合框中的选定值返回到文本块中?

Positions对象的psnme属性绑定到数据对象的Positionname属性:

<ComboBox x:Name="poscombo" Loaded="comboposloaded"
          SelectedValue="Binding Positionname, UpdateSourceTrigger=PropertyChanged"/>

【讨论】:

【参考方案2】:

DataGridComboBoxColumn 的数据绑定看起来比您想象的要复杂一些。

    使用 ObservableCollection 而不是 List。这将自动更新 DataGrid 的内容。 您可以使用 ObjectDataProvide 将数据加载到组合框中。这也将确保源中的数据自动更新。 这是一个工作示例。
    public partial class MainWindow : Window
    
        public EmployeeViewModel EmployeeVM;
        public MainWindow()
        
            InitializeComponent();
            EmployeeVM = new EmployeeViewModel();
            MyDataGrid.ItemsSource = EmployeeVM.EmployeeList;
        
    

    public class Employee
    
        public string Name  get; set; 
        public PositionEnum Position  get; set; 
    

    public enum PositionEnum  Marketeer, Mechanic, Accountant ;
    public class EmployeeViewModel 
    
        public ObservableCollection<Employee> EmployeeList =
          new ObservableCollection<Employee>();
        public EmployeeViewModel()
         
            EmployeeList.Add(new Employee()
              Name = "James Smith", Position = PositionEnum.Accountant );
            EmployeeList.Add(new Employee()
              Name = "Robert Johnson", Position = PositionEnum.Marketeer );
            EmployeeList.Add(new Employee() 
              Name = "David Williams", Position = PositionEnum.Mechanic );
        
    

XAML

<Window x:Class="WpfApp6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:core="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApp6"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" >
    <Window.Resources>
        <!--Create list of enumeration values-->
        <ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="x:Type core:Enum">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="local:PositionEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="MyDataGrid"
            AutoGenerateColumns="False"      
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            RowHeaderWidth="0" >
            <DataGrid.Columns>
                <DataGridTextColumn
                   Binding="Binding Name"
                   Header="Name" />
                <DataGridComboBoxColumn
                    Header="Order Status"
                    SelectedItemBinding="Binding Position"
                    ItemsSource="Binding Source=StaticResource myEnum" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

认为您需要熟悉 MVVM 模式并将其用作构建此类应用程序的基础。

【讨论】:

以上是关于将 List 中的数据放入 DataGrid ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将 DataGrid 放入 ComboBox

Java List实体类去重

WPF-动态生成DataGrid

如何将 List<CustomObject> 绑定到 WPF DataGrid?

easyui中datagrid常见功能

如何更新 UWP Microsoft Toolkit DataGrid 中的单元格值?