MVVM模式下DataSet数据转Model变量再更新DataGrid的实现疑问
MVVM模式下DataSet数据转Model并更新DataGrid的解决方案
看起来你在MVVM实践中卡在了DataSet数据到Model的传递,以及UI同步更新这一步,我来帮你一步步解决这个问题,先从修正你现有代码的问题开始,再完整实现整个流程。
首先,你的代码里有几个明显的错误:
- DataSet的表集合是
Tables而不是Table,所以应该是data.Tables[0] - 直接调用
ToString()是拿不到单元格值的,得指定行和列,比如取第一行的FirstName列值:data.Tables[0].Rows[0]["FirstName"].ToString()
接下来,按照MVVM的规范,我们需要让Model实现INotifyPropertyChanged接口,这样当属性值变化时才能通知UI自动更新。
1. 实现带属性变更通知的Model类
using System.ComponentModel; using System.Runtime.CompilerServices; public class UserModel : INotifyPropertyChanged { private string _firstName; private string _lastName; public string FirstName { get => _firstName; set { if (_firstName != value) { _firstName = value; OnPropertyChanged(); } } } public string LastName { get => _lastName; set { if (_lastName != value) { _lastName = value; OnPropertyChanged(); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 在ViewModel中处理DataSet数据并更新Model
ViewModel是连接Model和View的中间层,我们在这里完成从DataSet到Model的数据赋值逻辑:
public class UserViewModel { public UserModel CurrentUser { get; set; } public UserViewModel() { CurrentUser = new UserModel(); } public string UpdateUser() { try { Auth obj = new Auth(); DataSet data = obj.updateuser(); // 先判断DataSet、表、行是否有效,避免空引用异常 if (data?.Tables.Count > 0 && data.Tables[0].Rows.Count > 0) { var targetRow = data.Tables[0].Rows[0]; // 赋值给Model的属性,此时会自动触发PropertyChanged通知UI刷新 CurrentUser.FirstName = targetRow["FirstName"].ToString(); CurrentUser.LastName = targetRow["LastName"].ToString(); } return "数据更新成功"; } catch (Exception ex) { // 这里可以根据实际需求添加异常日志或提示逻辑 return $"更新失败:{ex.Message}"; } } }
3. 配置View(DataGrid)的绑定
在XAML中,先把ViewModel设置为View的DataContext,然后绑定DataGrid的列到Model的属性:
<!-- 先在View的资源或代码后台设置DataContext为UserViewModel实例 --> <Window.DataContext> <local:UserViewModel /> </Window.DataContext> <DataGrid AutoGenerateColumns="False" DataContext="{Binding CurrentUser}"> <DataGrid.Columns> <DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" /> <DataGridTextColumn Header="LastName" Binding="{Binding LastName}" /> </DataGrid.Columns> </DataGrid>
如果需要显示多条用户数据,你可以在ViewModel中维护一个ObservableCollection<UserModel>,把DataSet的每一行都转成UserModel对象加入集合,再绑定DataGrid的ItemsSource="{Binding UserList}"即可。
当你调用UpdateUser()方法后,Model的属性值更新会自动通知DataGrid同步刷新显示。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

