![](/img/trans.png)
[英]Get Checkbox value in Datagrid bound to an ItemsSource in wpf
[英]Get the Checkbox value in wpf datagrid
我在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");
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.