我有 ASP.NET 背景,我的任务是维护一个 WPF 项目,所以这是一个相当大的学习曲线。
我有一个带有以下 XAML 的 DataGrid
<DataGrid Name="StockGV" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Scanned" IsReadOnly="true">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="StatusImage" Source="tick.png"></Image>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding PalletScanned}" Value="False">
<Setter TargetName="StatusImage" Property="Source" Value="cross.png"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Pallet Number" IsReadOnly="True" Binding="{Binding PalletNumber}">
</DataGridTextColumn>
<DataGridTextColumn Header="Quantity" IsReadOnly="True" Binding="{Binding Quantity}">
</DataGridTextColumn>
<DataGridTemplateColumn IsReadOnly="true">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:IntegerUpDown HorizontalAlignment="Left" Name="integerUpDown1" Maximum="{Binding Quantity}" Minimum="0" VerticalAlignment="Top" Value="{Binding Quantity, Mode=OneWay}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding PalletScanned}" Value="False">
<Setter TargetName="integerUpDown1" Property="IsEnabled" Value="False"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
用户更新最后一个字段(IntegerUpDown 控件),然后单击网格下方的“保存”按钮。我需要它遍历每一行,获取 IntegerUpDown 控件的值并将其保存到数据库中。如果这是 ASP.NET,我会这样做:
foreach (GridViewRow row in gv.Rows)
{
long pk = (long)gv.DataKeys[row.RowIndex].Value;
int value = (int)((IntegerUpDown)row.FindControl("integerUpDown1")).Value;
//Save to DB
}
我如何在 WPF 中执行此操作?请注意,如果有帮助,DataGrid 将绑定(bind)到匿名类型
最佳答案
哇,这不像它的本意:)
您通常应该将 DataGrid
绑定(bind)到类型 T 的 ItemsSource
。在列内部,您应该绑定(bind)到类型 T 的属性。
您的 IntegerUpDown Control
上的每个更改都会在基础 Collection 中表示。
要稍后在您的 ViewModel
中访问此值,您只需使用 Linq 查询 Collection
以获取值。
您的控件中已经有这段代码:
Value="{Binding Quantity, Mode=OneWay}"
因此您可以访问 Quantity 属性以获得您想要的值。
记住:
如果用户应该能够更改数量 Property
,则 Binding
必须是 Mode=TwoWay
并且需要有一个公共(public) setter 这个属性也是。
关于c# - WPF DataGrid - 遍历行并访问模板列中的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878008/