Связывание данных MVVM Выбранный элемент не обновляется - PullRequest
0 голосов
/ 11 января 2019

Я новичок в WPF и MVVM, и у меня есть приложение, которое использует Entity Framework для подключения к базе данных и сетку данных, чтобы показать пользователям приложения.

Операции CRUD пользователей выполняются в отдельном окне, а не в сетке данных.

Мои проблемы связаны с обновлением datagrid. Операция вставки в порядке, но обновление - нет.

Просмотр 1 (Список пользователей):

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

ViewModel:

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; } 

}

NotificationClass

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

если я закрою и открою представление 1, новое имя пользователя обновится ..

кто-нибудь может помочь? спасибо

Ответы [ 2 ]

0 голосов
/ 12 января 2019

это сработало! большое спасибо @nosale!

как насчет изменений, внесенных в SelectedUser, которые отражаются в моем контексте?

если я сделаю это:

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

я думал, что у объекта SelectedUser есть «тестовое» имя пользователя, а updatedUser имеет старое имя пользователя, но не .. updatedUser уже имеет «тест»

0 голосов
/ 12 января 2019

Просто реализовать INotifyPropertyChanged недостаточно, вы должны явно вызывать PropertyChanged (или в вашем случае OnPropertyChanged), когда свойство изменилось.
Смотри также https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

Вы можете сделать это так

class User : NotificationClass
{
    private int _id;
    private string _username;
    private string _createdBy;
    private DateTime? _createdOn;

    public int Id
    {
        get => _id;
        set
        {
            if (value == _id) return;
            _id = value;
            OnPropertyChanged();
        }
    }

    public string Username
    {
        get => _username;
        set
        {
            if (value == _username) return;
            _username = value;
            OnPropertyChanged();
        }
    }

    public string CreatedBy
    {
        get => _createdBy;
        set
        {
            if (value == _createdBy) return;
            _createdBy = value;
            OnPropertyChanged();
        }
    }

    public DateTime? CreatedOn
    {
        get => _createdOn;
        set
        {
            if (value.Equals(_createdOn)) return;
            _createdOn = value;
            OnPropertyChanged();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...