wpf - 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,则会更新新用户名..
有人可以帮忙吗?谢谢
解决方案
有效 !非常感谢@nosale!
对 SelectedUser 所做的更改如何反映在我的上下文中?
如果我这样做:
SelectedUser.Username = "test";
User updatedUser = _db.User.First(p => p.Id == SelectedUser.Id);
我在想 SelectedUser 对象有“test”用户名,而 updatedUser 有旧用户名,但不是 .. updatedUser 已经有“test”
推荐阅读
- tfs - 从 Azure Dev Ops 执行增强的测试套件导出时加载 dataTFS.WebApi.Exception 时出错
- azure - Azure Devops 无法禁用“新服务连接体验”
- azure - Azure Function 在执行期间关闭
- turing-machines - TOC 程序 A,当给定任何程序 B 作为输入时,可以确定 B 是否产生“hello world”
- docker - Docker compose env 变量未替换
- r - 根据数据框的名称列出数据框(按名称调用数据框)
- netlogo - 如何将具有随机值的属性分配给海龟?
- java - QueryDsl - 创建一个谓词来检查 localdate 是否是当前周的一部分
- c - 在linux中使用strchr查找绝对路径
- shopify-app - 根据商品编号打印不同商品的折扣值