c# - WPF DataGrid - 遍历行并访问模板列中的控件

标签 c# wpf xaml datagrid

我有 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/

相关文章:

wpf - 在 XAML 中的 ListView 内拉伸(stretch)网格

c# - 任何人都知道更简单的方法来制作 Reverse 并取第一个和最后一个字母?

c# - 如何在 MSTest 中附加测试失败的屏幕截图?

c# - DispatcherTimer Stop 不停止

xaml - Xaml 中的 WPF RadioButton 组

c# - 如何根据搜索字符串在列表框中显示可观察集合中的对象?

c# - 如何拦截所有按键事件,包括 ctrl+alt+del 和 ctrl+tab?

c# - 更好的 Linq 查询,用于过滤没有子项的父列表

c# - DPI 在 BitmapSource.Create() 方法中的相关性是什么?

c# - 在 Graphsharp 中向边缘添加自定义样式