WPF中数据网格的双向绑定
本文关键字:绑定 网格 数据 数据网 WPF | 更新日期: 2023-09-27 18:11:50
我有一个WPF DataGrid,我正在使用
填充var allLines = from Lines in ctx.InvoiceLines join PerPs in ctx.ProductsViews on Lines.ProductCode equals PerPs.ProductCode
where (Lines.BranchNo == BrNo) && (Lines.Docket == Docket)
select new { Lines.ProductCode, Lines.Description, Lines.Inv_Quantity, Lines.Grn_Quantity,
Lines.Inv_Price,Lines.Grn_Price,Lines.Inv_Total, Lines.Grn_Total, Lines.AnalCode,
Lines.Vat_Rate, Lines.GrnNo,Lines.Comment , PerPs.OuterUnits};
dgGrid.ItemsSource = allLines;
我想使用双向绑定来更新数据库时,任何值被更改或添加新行。这可能吗?
我的xaml代码是<DataGrid Grid.Row="3" x:Name="dgGrid" DataContext="{Binding}" FontSize="16" HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible" SelectionUnit="FullRow" SelectionMode="Extended" AutoGenerateColumns="False"
SelectionChanged="dgGrid_SelectionChanged" >
<DataGrid.Columns>
<DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="250" Header="Description" Binding="{Binding Description, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" FontSize="14"/>
<DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="63" Header="Grn_Quantity" Binding="{Binding Grn_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="59" Header="Inv_Price" Binding="{Binding Inv_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="61" Header="Ord_Price" Binding="{Binding Grn_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="72" Header="Inv_Total" Binding="{Binding Inv_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="74" Header="Grn_Total" Binding="{Binding Grn_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="58" Header="AnalCode" Binding="{Binding AnalCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="40" Header="Vat_Rate" Binding="{Binding Vat_Rate, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="GrnNo" Binding="{Binding GrnNo, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="Comment" Binding="{Binding Comment, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="PerP" Binding="{Binding OuterUnits}" IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSteelBlue"/>
</DataGrid.Resources>
</DataGrid>
当我运行这段代码时,除了PerP列外,其他列都是空的。
我不知道如何做最好,所以任何帮助都将非常感谢。
除了"PerP"列之外,您的DataGridTextColumn
的所有Bindings
都指定了两次路径。例如:
<DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
这里你的Binding
首先指定路径为"ProductCode",然后也指定它为"IsSelected"。由于要绑定到网格的集合中的对象上没有"IsSelected"属性,如果在调试器下运行此属性,应该会在Output窗口中看到绑定错误。如果您删除了这些绑定的Path=IsSelected
,那么列值应该被正确绑定。
你的数据源是一个匿名类型的集合,所以var
是必要的,但是正如其他人所说,到该集合的双向绑定对于返回到源的更新是不起作用的。
您的allLines
变量是一个匿名类型的可枚举对象。在c#中,匿名类型是只读的——属性不能编辑,更改也不能保存。
试着查询:
var allLines =
from Lines in ctx.InvoiceLines
join PerPs in ctx.ProductsViews on Lines.ProductCode equals PerPs.ProductCode
where (Lines.BranchNo == BrNo) && (Lines.Docket == Docket)
select Lines;
dgGrid.ItemsSource = allLines.ToList();
如果"allLines"变量是DataTable
,您可以将DataGrid的AutoGenerateColumns
设置为true。
你也不需要使用"DataContext"属性,而是使用"ItemsSource"。
像这样:
<DataGrid ItemsSource="{Binding Path=allLines.DefaultView}" ... />
要在更改时更新数据库,调用数据表的Update()
方法,例如单击"保存"按钮。
如果"allLines"不是DataTable,那么删除这个讨厌的"var"关键字,并告诉我们变量的真实属性=)