首页 > 解决方案 > 在 WPF C# 中的 DatagridComboboxColumn 正文中使用 Datagrid

问题描述

我有一个 7 列的数据网格。其中一列必须是组合框,当用户单击组合框时,必须显示表单或面板,其中包含数据网格。第二个数据网格有一些列,必须有可编辑的行等。我怎样才能在 DatagridColumn 中实现这个?图片中给出了信息: Datagrid in combobox body

或者是否有一个组件可以用来实现这样的东西?谢谢你的帮助。

标签: c#wpfdatagrid

解决方案


您可以使用 DataGridTemplateColumn,然后使用带有另一个 DataGrid 的 Popup 面板添加编辑模板。

这是此解决方案的一个示例。

  • 双击“Tot.Quantity”单元格以显示弹出窗口。
  • 单击其他单元格以关闭弹出窗口。
  • 更改 Popup 中的数量,会在关闭 Popup 时影响“Tot.Quantity”值。

主窗口.xaml

<Window x:Class="SODataGridInComboBox.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:local="clr-namespace:SODataGridInComboBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid>
            <Grid.Resources>
                <DataTemplate x:Key="MyTemplate" >
                    <TextBlock Text="{Binding TotalQuantity}" HorizontalAlignment="Right" />
                </DataTemplate>
                <!--DataTemplate when in edit mode. -->
                <DataTemplate x:Key="EditingMyTemplate" DataType="ProductPartList">
                    <Popup IsOpen="True">
                        <DataGrid ItemsSource="{Binding PartList}" AutoGenerateColumns="False">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Id" Binding="{Binding PartId}"/>
                                <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, Mode=TwoWay}"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </Popup>
                </DataTemplate>
            </Grid.Resources>
            <DataGrid Name="DG1" ItemsSource="{Binding Products}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                    <!--Custom column that shows the part list-->
                    <DataGridTemplateColumn Header="Tot.Quantity" CellTemplate="{StaticResource MyTemplate}" CellEditingTemplate="{StaticResource EditingMyTemplate}" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>
</Window>

主窗口.xaml.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;

namespace SODataGridInComboBox
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = this;
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }

        public ObservableCollection<Product> Products { get; } = new ObservableCollection<Product>();

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Products.Add(
                new Product()
                {
                    Id = "Prod1",
                    PartList = new List<ProductPartList>()
                    {
                        new ProductPartList() { PartId = "p11", Quantity=3},
                        new ProductPartList() { PartId = "p12", Quantity=2}
                    }
                });
        }
    }

    public class Product
    {
        public string Id { get; set; }
        public List<ProductPartList> PartList { get; set; }
        public int TotalQuantity => PartList?.Sum(p => p.Quantity) ?? 0;
    }

    public class ProductPartList
    {
        public string PartId { get; set; }
        public int Quantity { get; set; }
    }
}

推荐阅读