datagrid wpf 刷新数据_WPF MVVM DataGrid数据直更新

在WPF MVVM模式下,当实体类实现INotifyPropertyChanged接口时,UI通常能自动响应数据变化。然而,在DataGrid中,如果在编辑模式下更新数据并退出单元格但不离开编辑行,关联的数据显示可能不会更新。为解决这个问题,可以通过自定义DataGrid附加属性实现实时提交。DataGridHelper类提供了一个名为RealTimeCommit的静态方法,用于在单元格编辑结束时强制提交编辑,确保数据实时更新。这种方法在处理多个关联属性时避免了用户需要手动切换行以查看更新的不便。
摘要由CSDN通过智能技术生成

WPF MVVM所有类基本上都会实现System.ComponentModel.INotifyPropertyChanged接口 .举例为TestModel实体类A3只是A1与A2的数据处理后显示,只要A1或A2有更新的情况前台UI都有变化实体如下.

但在DataGrid中有个很特别的问题,进入了编辑模式但在更新A1时退出当前单元的编辑模式,而不退出编辑行时A3的数据是不会有反应的变化.这样子有才生了一个问题,如果有好几个属性都是有关联的不可能为了知道属性处理真的变化,让客户换行后,发现数据不对了返回那个行进行编辑吧.这样也太友好了.那样实际下图的功能呢

.

这样主是用到MVVM的Binding功能.而在控件的属性BindingGroup中反取回你在Binding时的相关属性,而这个类在MVVM中UI改变时返传到VM对应属性时就是由这类来可控制.这MVVM的机制说起来就很复杂了.还是直接上代码吧

publicstaticclassDataGridHelper

{

publicstaticvoidSetRealTimeCommit(DataGriddataGrid, boolisRealTime)

{

dataGrid.SetValue(RealTimeCommitProperty, isRealTime);

}

publicstaticboolGetRealTimeCommit(DataGriddataGrid)

{

return(bool)dataGrid.GetValue(RealTimeCommitProperty);

}

publicstaticreadonlyDependencyPropertyRealTimeCommitProperty =

DependencyProperty.RegisterAttached("RealTimeCommit", typeof(bool),

typeof(DataGridHelper),

newPropertyMetadata(false, RealTimeCommitCallBack));

privatestaticvoidRealTimeCommitCallBack(DependencyObjectd, DependencyPropertyChangedEventArgse)

{

vardg= d asDataGrid;

if(dg == null)

return;

EventHandler ceHandler = delegate(objectxx, DataGridCellEditEndingEventArgsyy)

{

varflag = GetRealTimeCommit(dg);

if(!flag)

return;

varcellContent = yy.Column.GetCellContent(yy.Row);

if(cellContent != null&& cellContent.BindingGroup != null)

cellContent.BindingGroup.CommitEdit();

};

dg.CellEditEnding += ceHandler;

RoutedEventHandlereh = null;

eh = (xx, yy) =>

{

dg.Unloaded -= eh;

dg.CellEditEnding -= ceHandler;

};

dg.Unloaded += eh;

}

}

使用代码使用附加属性

WPF MVVM架构中,如果想在单例模式下更新DataGrid绑定的数据,通常你会遵循以下步骤: 1. **创建MVVM模式**: - 创建一个ViewModel类,例如`MyDataViewModel`,它包含了你的数据集合和相关的观察者(比如`ICollectionView`或`ObservableCollection`),以及更新数据的方法。 ```csharp public class MyDataViewModel { private ObservableCollection<MyObject> data; public ObservableCollection<MyObject> DataSource { get => data; set { if (value == data) return; data = value; OnPropertyChanged("DataSource"); } } public void UpdateData() { // 更新data集合... DataSource = new ObservableCollection<MyObject>(updatedData); } // Implement INotifyPropertyChanged for notifying UI changes public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 2. **单例窗口和绑定**: - 在`MainWindow`中,实例化单例的`MyDataViewModel`,并将DataGrid的Binding设置到`DataSource`属性上。 ```xaml <Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <DataGrid ItemsSource="{Binding DataSource}" /> </Window> ``` - 在窗体加载或需要更新数据时,调用`MyDataViewModel`的`UpdateData()`方法。 ```csharp public MainWindow() { InitializeComponent(); // 单例实例 var viewModel = MyDataViewModel.Instance; DataContext = viewModel; // 更新数据示例 viewModel.UpdateData(); } ``` 3. **数据变化处理**: - 在ViewModel中添加数据变化监听,确保只有在需要的时候才更新UI,而不是每次数据更改都触发更新。 ```csharp public void UpdateData(int? filterValue) { if (filterValue.HasValue && !filteredData.Contains(filterValue)) { filteredData.Add(filterValue); UpdateDataSource(); } } private void UpdateDataSource() { // 在这里仅更新已过滤的数据,而不是整个集合 // ... RaisePropertyChange("FilteredDataSource"); } ``` 当你需要更新DataGrid时,传递相应的筛选条件给`UpdateData`方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值