【问题标题】:Binding to a List<>绑定到列表<>
【发布时间】:2011-02-12 00:33:01
【问题描述】:

我有一个这样的数据网格:

<dg:DataGrid Name="dg" AutoGenerateColumns="False" CanUserDeleteRows="True">
                    <dg:DataGrid.Columns>
                        <dg:DataGridTextColumn Header="Product Code" x:Name="columnProductCode" Binding="{Binding Path=Product.ProductCode}" IsReadOnly="True" ></dg:DataGridTextColumn>
                        <dg:DataGridTextColumn Header="Product Name" x:Name="columnProductName" Binding="{Binding Path=Product.Name}" IsReadOnly="True" ></dg:DataGridTextColumn>
                        <dg:DataGridTextColumn Header="ProductMeasure" x:Name="columnDonViTinh" Binding="{Binding Path=Product.Measure IsReadOnly="True"></dg:DataGridTextColumn>
                        <dg:DataGridTextColumn Header="Quantity" x:Name="ColumnQuantity" Binding="{Binding Path=Quantity IsReadOnly="False"></dg:DataGridTextColumn>
                    </dg:DataGrid.Columns>
</dg:DataGrid>

在后面的代码中,我有一个这样的结构:

private struct ProductDetail
        {

            public TProduct Product { get; set ; } // TProduct is a class provied by a web service
            public int Quantity { get; set; }
        }

还有一个这样的列表:

        private IList<ProductDetail> bs = new List<ProductDetail>();

我曾尝试将数据填充到“bs”。并像这样绑定:

this.dg.ItemsSource = this.bs;

一切正常。我可以插入新行,删除行,但是当我尝试修改 Quantity 列时,然后单击数据网格的标题(以求助)-> Quantity 列更改为之前。

我该如何解决这个问题。 谢谢高级。

【问题讨论】:

    标签: wpf list datagrid binding


    【解决方案1】:

    好的,我尝试定义一个类(也具有 TProduct 和 Quantity 属性)而不是当前结构。而且..它有效=.=

    private class ProductDetail
    {
        public TProduct Product { get; set ; } // TProduct is a class provied by a web service
        public int Quantity { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      在您的数据网格上,您必须指定当您更改属性时数据会更改,而不是离开单元格。为此,您将UpdateSourceTrigger=PropertyChanged 添加到您的绑定中,然后它应该可以工作。您的 DataGrid 现在将如下所示:

      <dg:DataGrid Name="dg" AutoGenerateColumns="False" CanUserDeleteRows="True">
          <dg:DataGrid.Columns>
              <dg:DataGridTextColumn Header="Product Code"
                  x:Name="columnProductCode" 
                  Binding="{Binding Path=Product.ProductCode, UpdateSourceTrigger=PropertyChanged}"
                  IsReadOnly="True" >
              </dg:DataGridTextColumn>
              <dg:DataGridTextColumn Header="Product Name"
                  x:Name="columnProductName"
                  Binding="{Binding Path=Product.Name, UpdateSourceTrigger=PropertyChanged}"
                  IsReadOnly="True" >
              </dg:DataGridTextColumn>
              <dg:DataGridTextColumn Header="ProductMeasure"
                  x:Name="columnDonViTinh"
                  Binding="{Binding Path=Product.Measure, UpdateSourceTrigger=PropertyChanged}"
                  IsReadOnly="True">
              </dg:DataGridTextColumn>
              <dg:DataGridTextColumn Header="Quantity"
                  x:Name="ColumnQuantity"
                  Binding="{Binding Path=Quantity, UpdateSourceTrigger=PropertyChanged}" 
                  IsReadOnly="False">
              </dg:DataGridTextColumn>
          </dg:DataGrid.Columns>
      </dg:DataGrid>
      

      【讨论】:

      • 感谢 Mike Brown 和 Brent。我尝试了“UpdateSourceTrigger=PropertyChanged”,但它不起作用。
      【解决方案3】:

      我不知道 DataGrid 的完整 API,但我认为您必须在将更改推送回底层对象之前提交更改。 Looking at the docs 在您更改单元格或按 Enter 之前,似乎没有提交编辑。如果您在执行上述任一操作之前进行排序,则可能会取消编辑。

      【讨论】:

      • 感谢 Mike Brown 和 Brent。我尝试了“UpdateSourceTrigger=PropertyChanged”,但它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 2014-08-13
      相关资源
      最近更新 更多