0

i have a datagrid in wpf, i have multiple rows(items) in that datagrid and have one checkbox column in each row. i want to check in all rows if the checkbox is checked in any row then perform action below is my code. Thanks!

WPF Code

<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# code

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");
                }

            }
        }
4

1 回答 1

1

您已经在使用 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");
        }
    }
}
于 2013-09-23T14:41:59.507 回答