c# - 如何在 WPF 中将 datagrid 与两个 itemsSource 绑定?
问题描述
我的 xaml 中有类似的东西
<DataGrid Name="dgDisplay" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemCode" Width="100" Header="Barcode" Binding="{Binding ItemCode}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemName" Width="200" Header="Item Name" Binding="{Binding ItemName}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemPrice" Width="100" Header="Item Price" Binding="{Binding ItemPrice, StringFormat=RM {0}}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgQuantity" Width="150" Header="Quantity" Binding="{Binding Quantity, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate >
<DataTemplate x:Name="dtItemDisplay" >
<StackPanel Name="spItemDisplay2" HorizontalAlignment="Stretch" Background="White" >
<Grid>
<TextBlock Text="Discount: " FontWeight="Bold" Grid.Column="2" Grid.Row="1"/>
<TextBox KeyDown="TxtDisc_KeyDown" x:Name="txtDisc" Text="{Binding Discount, UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.Row="1"/>
<DataGrid ItemsSource="{Binding itemSubDisplayList2}" x:Name="dgItemSub">
<DataGrid.Columns>
<DataGridTextColumn Header="item sub" Binding="{Binding ItemIdSub}"/>
<DataGridTextColumn Header="item sub code" Binding="{Binding ItemSubCode}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
我有两个需要在此数据网格中绑定的列表或源。对于项目中的项目datagrid.column
和文本框Discount
(在 RowDetailsTemplate 中),它同时使用itemsSource = itemDisplayList
'dgItemSub' 中的项目,它使用 itemsSourceitemSubDisplayList2
问题是我的代码后面有这个代码
dgDisplay.ItemsSource = itemDisplayList;
dgDisplay.ItemsSource = itemSubDisplayList2;
但似乎我不能同时使用两者。只有绑定到itemSubDisplayList2
作品的项目。但如果我不这样做,它不会在我的数据网格中显示任何输出。
我尝试过这样的事情
<DataGrid Name="dgDisplay" ItemsSource="{Binding itemDisplayList}">
<DataGrid ItemsSource="{Binding itemSubDisplayList2}" x:Name="dgItemSub">
没有做dgDisplay.ItemsSource = itemDisplayList;
和dgDisplay.ItemsSource = itemSubDisplayList2;
后面的代码,但它没有工作。
如何从 2 itemsSource 中绑定?
或者有什么方法可以dgItemSub
从后面的代码中访问。就像我想要这样的东西
dgItemSub.ItemsSource = itemSubDisplayList2;
这就是我编码的方式itemDisplayList
,itemSubDisplayList2
并且我在后面的代码中编码
ItemDisplay itemDisplay = new ItemDisplay()
{
ItemCode = item.ItemCode,
ItemName = item.ItemName,
ItemPrice = item.ItemPrice,
Quantity = 1,
};
itemDisplayList.Add(itemDisplay);
foreach (var id in itemIds)
{
SimpleItem item2 = simpleItemBO.GetItemByItemId(id);
itemList.Add(item2);
ItemSubDisplay itemSubDisplay = new ItemSubDisplay();
itemSubDisplay.ItemIdSub = item2.ItemId;
itemSubDisplay.ItemSubCode = item2.ItemCode;
itemSubDisplayList.Add(itemSubDisplay);
}
itemSubDisplayList2.AddRange(itemSubDisplayList);
解决方案
你好,我检查了这段代码,在这里你犯了一些错误,所以我修改了它 Xaml
<DataGrid Name="dgDisplay" AutoGenerateColumns="False" CanUserAddRows="False" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemCode" Width="100" Header="Barcode" Binding="{Binding ItemCode}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemName" Width="200" Header="Item Name" Binding="{Binding ItemName}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgItemPrice" Width="100" Header="Item Price" Binding="{Binding ItemPrice, StringFormat=RM {0}}" />
<DataGridTextColumn IsReadOnly="True" x:Name="dgQuantity" Width="150" Header="Quantity" Binding="{Binding Quantity, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate >
<DataTemplate x:Name="dtItemDisplay" >
<StackPanel Name="spItemDisplay2" HorizontalAlignment="Stretch" Background="White" >
<Grid>
<TextBlock Text="Discount: " FontWeight="Bold" Grid.Column="2" Grid.Row="1"/>
<TextBox x:Name="txtDisc" Text="{Binding Discount, UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.Row="1"/>
<DataGrid ItemsSource="{Binding itemSubDisplayList}" x:Name="dgItemSub" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="item sub" Binding="{Binding ItemIdSub}"/>
<DataGridTextColumn Header="item sub code" Binding="{Binding ItemSubCode}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
代码
public partial class MainWindow : Window
{
public List<ItemDisplay> itemDisplayList { get; set; }
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
itemDisplayList = new List<ItemDisplay>();
ItemDisplay itemDisplay = new ItemDisplay()
{
ItemCode = "1",
ItemName = "1",
ItemPrice = "1",
Quantity = "1",
itemSubDisplayList = new List<ItemSub>()
};
itemDisplay.itemSubDisplayList.Add(new ItemSub { ItemIdSub = "sa", ItemSubCode = "ran" });
itemDisplayList.Add(itemDisplay);
dgDisplay.ItemsSource = itemDisplayList;
}
public class ItemDisplay
{
public string ItemCode { get; set; }
public string ItemPrice { get; set; }
public string ItemName { get; set; }
public string Quantity { get; set; }
public List<ItemSub> itemSubDisplayList { get; set; }
}
public class ItemSub
{
public string ItemIdSub { get; set; }
public string ItemSubCode { get; set; }
}
推荐阅读
- c++ - 堆异常 -1073741510 对象
- django - Plesk 乘客 django 观看 manage.py 日志
- python - 在什么情况下操作系统会知道 Python 创建的线程?
- javascript - Firebase 查询快照为时间戳字段返回 null 而不是任何值
- javascript - 如何在 react/javascript 中通过首字母过滤对象数组
- javascript - 编辑用 JQuery 加载的 HTML
- r - 将来自不同数据集的多条回归线的图例添加到 ggplot
- javascript - ExpressJs req.body 显示未定义
- python - 我想知道如何制作合并功能
- html - 为什么我在引导程序中的断点不是好的网格不工作