绑定到列表<>

时间:2010-04-25 04:17:54

标签: wpf list datagrid binding

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

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

一切都好。我可以插入一个新行,删除行,但是当我尝试修改列数量时,然后单击datagrid的标题(到度假村) - &gt;数量列更改为它之前。

如何解决此问题。 谢谢高级。

3 个答案:

答案 0 :(得分:4)

在数据网格上,必须指定在更改属性时数据发生更改,而不是保留单元格。为此,您将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>

答案 1 :(得分:1)

我不知道DataGrid的完整API,但我认为您必须在将更改推送回底层对象之前提交更改。 Looking at the docs看起来直到更改单元格或按Enter键才会提交编辑。如果在执行这些操作之前进行排序,则可能会取消编辑。

答案 2 :(得分:1)

好的,我已经尝试定义一个类(也有TProduct和Quantity属性)而不是当前的struct。并且...它的工作原理=。=

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