获取 wpf 数据网格中的复选框值
本文关键字:复选框 网格 wpf 数据 数据网 获取 | 更新日期: 2023-09-27 18:32:29
我在WPF中有一个数据网格,我在该数据网格中有多个行(项目),并且每行都有一个复选框列。 我想签入所有行,如果选中任何行中的复选框,然后执行以下操作 以下是我的代码。谢谢!
WPF 代码
<DataGrid CanUserAddRows="False" AutoGenerateColumns="False"
CellEditEnding="SaveDeliveryValue" LoadingRow="DataGrid_LoadingRow"
Name="ViewOrdersGrid" HorizontalAlignment="Center" Margin="0,10,0,0"
VerticalAlignment="Top" Height="278" Width="520" BorderBrush="#FFA0A0A0">
<DataGrid.Columns>
<DataGridTextColumn Header="Order No" Width="115" Binding="{Binding Path=BONo, Mode=OneWay}" />
<DataGridTextColumn Header="Order Date" Width="100" Binding="{Binding Path=BODate, Mode=OneWay, StringFormat=d}" />
<DataGridTextColumn Header="Total Amount" Width="100" Binding="{Binding Path=BOTotal, Mode=OneWay}" />
<DataGridTextColumn Header="Total Bikes" Width="100" Binding="{Binding Path=BOTatalBikes, Mode=OneWay}" />
<DataGridCheckBoxColumn Header="Delivered" x:Name="DeliveryValueCheck" Width="70" Binding="{Binding Path=BODelivered, Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
C# 代码
private void Window_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < ViewOrdersGrid.Items.Count; i++)
{
CheckBox mycheckbox = ViewOrdersGrid.Columns[4].GetCellContent(ViewOrdersGrid.Items[i]) as CheckBox;
if (mycheckbox.IsChecked == true)
{
MessageBox.Show("Checked");
}
}
}
你已经在使用 MVVM,我可以通过绑定看到,所以你有一个良好的开端。现在,由于 MVVM 允许 UI 和数据之间建立非常紧密的关系,因此我们可以推断,如果我们可以遍历给定对象上已检查属性的可视化树,我们也应该能够遍历此类属性的数据。因此,您的 C# 代码应如下所示(假设在您的代码中,DataGrid 的 ItemsSource 绑定到集合(我们称之为 MyItems):
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var viewModel = (ViewModelType)this.DataContext;
foreach(var item in viewModel.MyItems)
{
if(item.BODelivered)
{
MessageBox.Show("Checked");
}
}
}
此示例假定(因为示例的其余部分适当地使用绑定)网格绑定到某些内容(我们称之为 MyItems)。如果您需要了解其工作原理(这意味着您尚未将其实现为 MVVM 和 FOOLED ME),请考虑以下事项:
这是你的 XAML
<DataGrid CanUserAddRows="False" AutoGenerateColumns="False"
CellEditEnding="SaveDeliveryValue" LoadingRow="DataGrid_LoadingRow"
Name="ViewOrdersGrid" HorizontalAlignment="Center" Margin="0,10,0,0"
VerticalAlignment="Top" Height="278" Width="520" BorderBrush="#FFA0A0A0"
ItemsSource="{Binding MyItems}">
<DataGrid.Columns>
<DataGridTextColumn Header="Order No" Width="115" Binding="{Binding Path=BONo, Mode=OneWay}" />
<DataGridTextColumn Header="Order Date" Width="100" Binding="{Binding Path=BODate, Mode=OneWay, StringFormat=d}" />
<DataGridTextColumn Header="Total Amount" Width="100" Binding="{Binding Path=BOTotal, Mode=OneWay}" />
<DataGridTextColumn Header="Total Bikes" Width="100" Binding="{Binding Path=BOTatalBikes, Mode=OneWay}" />
<DataGridCheckBoxColumn Header="Delivered" x:Name="DeliveryValueCheck" Width="70" Binding="{Binding Path=BODelivered, Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
这是您的数据结构
public class MyObject
{
public int BONo { get; set; }
public DateTime BODate { get; set; }
public int BOTotal { get; set; }
public int BOTatalBikes { get; set; }
public bool BODelivered { get; set; }
}
这是您的 *.xaml.cs 文件
// this is the constructor for your view (MyWindow.xaml.cs)
private MyWindow( )
{
this.DataContext = new MyViewModel( );
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var viewModel = (ViewModelType)this.DataContext;
foreach(var item in viewModel.MyItems)
{
if(item.BODelivered)
{
MessageBox.Show("Checked");
}
}
}
这是您的视图模型 (MyViewModel.cs)
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void OnPropertyChanged(string property)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
private ObservableCollection<YourObjectTypeHere> _myItems;
public ObservableCollection<YourObjectTypeHere> MyItems
{
get
{
return _myItems;
}
set
{
_myItems = value;
OnPropertyChanged("MyItems");
}
}
}