WPF datagrid - 值更改后立即提交复选框列中的更改

swift

1个回答

写回答

写在歌里

2025-08-29 02:30

+ 关注

XML
XML

使用WPF中的DataGrid控件时,有时我们希望当用户更改复选框列中的值后,能够立即将更改提交到数据源。本文将介绍如何实现这一功能,并提供一个案例代码来演示。

在WPF中,DataGrid是一个常用的数据展示和编辑控件。它可以用来显示和编辑各种类型的数据,包括复选框列。然而,默认情况下,当用户更改复选框列中的值时,并不会立即将更改提交到数据源。这意味着,如果用户在更改复选框的值后,直接关闭应用程序或切换到其他行,那么更改将不会被保存。

为了解决这个问题,我们可以借助DataGrid的事件和绑定机制来实现更改的立即提交。具体来说,我们可以使用DataGrid的CellEditEnding事件和数据绑定的UpdateSourceTrigger属性。

首先,我们需要在XAML中定义一个DataGrid,并将复选框列的绑定模式设置为双向绑定。例如,我们可以有如下的XAML代码:

XML

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">

<DataGrid.Columns>

<DataGridCheckBoxColumn Header="IsSelected" Binding="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>

</DataGrid.Columns>

</DataGrid>

在上述代码中,我们创建了一个DataGrid,并绑定了一个名为Items的集合作为数据源。我们定义了一个复选框列(IsSelected),并将其绑定到数据项的一个属性(IsSelected)。同时,我们还定义了一个文本列(Name),用于显示数据项的名称。

接下来,我们需要在代码中处理CellEditEnding事件。在这个事件处理程序中,我们可以手动将更改提交到数据源。例如,我们可以有如下的代码:

csharp

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)

{

if (e.Column.Header.ToString() == "IsSelected")

{

var dataGrid = (DataGrid)sender;

var item = (Item)dataGrid.SelectedItem;

var checkBox = (CheckBox)e.EditingElement;

item.IsSelected = checkBox.IsChecked.GetValueOrDefault();

}

}

在上述代码中,我们首先检查正在编辑的单元格所在的列是否是复选框列。然后,我们获取DataGrid和当前选中的数据项。最后,我们将复选框的值赋给数据项的属性(IsSelected)。

通过以上步骤,我们就可以实现当用户更改复选框列中的值后,立即将更改提交到数据源的功能。

案例代码:

在这个案例中,我们假设有一个名为Item的类,具有IsSelected和Name两个属性。我们创建了一个名为Items的ObservableCollection集合,并将其作为DataGrid的数据源。

csharp

public class Item : INotifyPropertyChanged

{

private bool isSelected;

public bool IsSelected

{

get { return isSelected; }

set

{

if (isSelected != value)

{

isSelected = value;

OnPropertyChanged(nameof(IsSelected));

}

}

}

private string name;

public string Name

{

get { return name; }

set

{

if (name != value)

{

name = value;

OnPropertyChanged(nameof(Name));

}

}

}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)

{

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

}

public class ViewModel

{

public ObservableCollection<Item> Items { get; set; }

public ViewModel()

{

Items = new ObservableCollection<Item>()

{

new Item() { IsSelected = true, Name = "Item 1" },

new Item() { IsSelected = false, Name = "Item 2" },

new Item() { IsSelected = true, Name = "Item 3" }

};

}

}

在ViewModel中,我们定义了一个ObservableCollection类型的属性Items,并在构造函数中初始化了一些示例数据。

在XAML中,我们将DataGrid的ItemsSource绑定到ViewModel的Items属性,并为DataGrid的列定义了绑定和事件处理程序。

通过以上代码,我们可以在DataGrid中实现复选框列的更改立即提交功能。无论是用户点击复选框,还是通过键盘操作改变复选框的选中状态,都会立即将更改提交到数据源。这样,我们就可以确保更改不会丢失,用户的操作也能得到及时的响应。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号