首页 > 解决方案 > MVVM Datagrid Binding SelectedItem 未更新

问题描述

我是 WPF 和 MVVM 的新手,我有一个应用程序,它使用实体框架连接到数据库和一个数据网格来显示应用程序的用户。

用户 CRUD 操作是在单独的窗口中进行的,而不是在数据网格中。

我的问题与数据网格的更新有关。插入操作可以,但更新不行。

查看 1(用户列表):

<DataGrid Grid.Row="1" 
  ItemsSource="{Binding Users, Mode=TwoWay}" 
  SelectedItem="{Binding SelectedUser, Mode=TwoWay}" 
  AutoGenerateColumns="False" 
  CanUserAddRows="False">
</DataGrid>

视图模型:

class UserListViewModel: NotificationClass
{
    UserDBContext _db = null;

    public UserListViewModel()
    {
        _db = new UserDBContext();

        Users = new ObservableCollection<User>(_db.User.ToList());
        SelectedUser = Users.FirstOrDefault();
    }

    private ObservableCollection<User> _users;
    public ObservableCollection<User> Users
    {
        get { return _users; }
        set
        {
            _users = value;
            OnProprtyChanged();
        }
    }

    private User _selectedUser;
    public User SelectedUser
    {
        get
        {
            return _selectedUser;
        }
        set
        {
            _selectedUser = value;
            OnProprtyChanged();
        }
    }

    public RelayCommand Edit
    {
        get
        {
            return new RelayCommand(EditUser, true);
        }
    }

    private void EditUser()
    {
        try
        {
            UserView view = new UserView();                
            view.DataContext = SelectedUser;
            view.ShowDialog();

            if (view.DialogResult.HasValue && view.DialogResult.Value)
            {                    
                if (SelectedUser.Id > 0){
                    User updatedUser = _db.User.First(p => p.Id == SelectedUser.Id);

                    updatedUser.Username = SelectedUser.Username; //this doesn't do nothing, object is already with the new username ?!
                }
                _db.SaveChanges();              
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }   
}

_db.SaveChanges()之后,不应该更新数据网格?

模型:

class UserDBContext: DbContext
{
    public UserDBContext() : base("name=DefaultConnection")
    {

    }

    public DbSet<User> User { get; set; }
}

查看 2(用户详细信息)

public partial class UserView : Window
{
    public UserView()
    {
        InitializeComponent();
    }

    private void SaveButton_Click(object sender, RoutedEventArgs e)
    {            
        DialogResult = true;
    }

}

用户对象

class User: NotificationClass
{
    public int Id { get; set; }

    public string Username { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? CreatedOn { get; set; } 

}

通知类

public class NotificationClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    public void OnProprtyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

如果我关闭并打开视图 1,则会更新新用户名..

有人可以帮忙吗?谢谢

标签: wpfentity-frameworkmvvmdatagrid

解决方案


有效 !非常感谢@nosale!

对 SelectedUser 所做的更改如何反映在我的上下文中?

如果我这样做:

SelectedUser.Username = "test";
User updatedUser = _db.User.First(p => p.Id == SelectedUser.Id);

我在想 SelectedUser 对象有“test”用户名,而 updatedUser 有旧用户名,但不是 .. updatedUser 已经有“test”


推荐阅读