c# - 在 WPF C# 中的 DatagridComboboxColumn 正文中使用 Datagrid
问题描述
我有一个 7 列的数据网格。其中一列必须是组合框,当用户单击组合框时,必须显示表单或面板,其中包含数据网格。第二个数据网格有一些列,必须有可编辑的行等。我怎样才能在 DatagridColumn 中实现这个?图片中给出了信息: Datagrid in combobox body
或者是否有一个组件可以用来实现这样的东西?谢谢你的帮助。
解决方案
您可以使用 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; }
}
}
推荐阅读
- jolt - 如何将值从上部对象移动到下部对象并在颠簸变换中保持分组
- powershell - 您可以使用 Powershell 设置视频的详细信息吗?
- swift - 如果应用程序未以编程方式安装 firebase 动态链接,则重定向到 iOS App Store
- sql-server - PowerApps 无法通过本地数据网关连接到本地 SQL Server
- xamarin - Xamarin.Forms UWP 应用 Xamarin 编辑器视图不会显示内容
- api - Google plus API 折旧
- javascript - vue.js 方法返回不断更新
- python - 根据范围获取存储在 pandas 数据框列中的值的频率计数,并由分类变量分隔
- c - 在基本 C 编程中使用“If 语句”。如何正确格式化它们?
- javascript - Express - 获取 router.get 以返回 json 数据属性