You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:38:27