【问题标题】:How to bind datagrid with two itemsSource in WPF?如何在 WPF 中将 datagrid 与两个 itemsSource 绑定?
【发布时间】:2019-04-17 02:10:19
【问题描述】:

我的 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”中的项目,它使用 itemsSource itemSubDisplayList2

问题是我的代码后面有这段代码

 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;

这就是我编码itemDisplayListitemSubDisplayList2 的方式,我在后面的代码中编码

       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);

【问题讨论】:

  • 你在使用 mvvm 吗?这需要在mvvm中完成吗?
  • 是的,我确实使用 mvvm,但我在后面的代码中编码 itemDisplayListitemSubDisplayList2
  • 如果你从外部设置数据上下文,你需要指定&lt;DataGrid x:Name="dgItemSub" ItemsSource="{Binding DataContext.itemSubDisplayList2}" 你需要使用类似的东西
  • 因为它存在于模板中。如果不起作用,请尝试发布您在哪里设置 DataContext
  • 这个itemSubDisplayList2 也会与itemDisplayList 中的所有行共享

标签: c# wpf data-binding datagrid


【解决方案1】:

你好,我检查了这段代码,这里你犯了一些错误,所以我修改了它 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; }
    }

输出

【讨论】:

  • 我已经尝试过您的代码及其工作。但我有一个问题,正如你在上面看到的itemSubDisplayList 我有一个foreach 循环。如何应用该循环?
  • @newbie,正如你所说,每一行都有不同的子项目,所以你需要在你的列表中列出一个列表,就像我在上面所采用的那样,并开始改变 for 循环我无法帮助很多它的领域依赖需要检查剩余的代码,我们可以做出正确的设计
  • @newbie 这只是一个例子。填充数据取决于域
  • 太棒了!你救了我的命:)它的工作太棒了!
  • @newbie 这是一个糟糕的答案,因为它没有解释任何内容。只有“here u have done some errors”没有说明这些错误到底是什么。发布一堆代码并不是一个好的答案,即使代码正是您所需要的。请记住,StackOverflow 是一个社区,帖子应该对所有读者都有用。
猜你喜欢
  • 2011-12-17
  • 2011-07-21
  • 1970-01-01
  • 2011-07-10
  • 2023-03-07
  • 2019-03-23
  • 2020-01-30
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多