列表视图删除刷新不起作用

本文关键字:不起作用 刷新 删除 视图 列表 | 更新日期: 2023-09-27 18:33:35

我正在开发具有基本CRUD功能的WPF MVVM应用程序。我使用包含和显示用户数据的 ListView。当我添加或更新某些用户时,ListVew 会立即刷新,但在删除命令后 ListView 不会刷新。在这种情况下,我必须关闭应用程序并再次运行以进行刷新列表视图。

XAML

<ListView  Name="LstUsers" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              ScrollViewer.VerticalScrollBarVisibility="Disabled" IsSynchronizedWithCurrentItem="True"
              ItemsSource="{Binding ViewList.View, UpdateSourceTrigger=PropertyChanged, IsAsync=True}"
              SelectedItem="{Binding CurrentSelectedUser, Mode=TwoWay}" Height="150" Margin="0,40,10,260" Grid.ColumnSpan="2" Grid.RowSpan="2">

查看模型

private ObservableCollection<User> _users;

public UserViewModel()
{
  _users = new ObservableCollection<User>(GetAllUsers());
// Paging Control
  ViewList = new CollectionViewSource();
  ViewList.Source = Users;
  ViewList.Filter += new FilterEventHandler(ViewFilter);
  CurrentPageIndex = 0;
  itemcount = Users.Count;
  CalculateTotalPages();
}
#region DeleteCommand
    public ICommand DeleteUserCmd
    {
        get { return new RelayCommand(k => DeleteUser(CurrentSelectedUser)); }
    }
    // Delete user from database.
    private void DeleteUser (User user)
    {
        if(CurrentSelectedUser != null)
        {
            using (var userManager = new UserManager())
            {
                MessageBoxResult msgResult = MessageBox.Show("Are you sure to delete user?", "Delete user?", System.Windows.MessageBoxButton.OKCancel, MessageBoxImage.Asterisk);
                if (msgResult == System.Windows.MessageBoxResult.Yes)
                {
                    return;
                }
                userManager.Delete(user);
                MessageBox.Show("User is deleted!", "Confirm!", MessageBoxButton.OK, MessageBoxImage.Asterisk);
                // Refresh Listview after delete record.
                Users.Remove(user);
            }
        }
        else
            MessageBox.Show("You must select user!", "Warning!", MessageBoxButton.OK, MessageBoxImage.Exclamation);  
    }
    #endregion

public CollectionViewSource ViewList { get; set; }
public ObservableCollection<User> Users
    {
        get
        {
            return _users;
        }
        set
        {
            _users = value;
            OnPropertyChanged("Users");
        }
    }

列表视图删除刷新不起作用

我添加了这一行

Users.Remove(Users.Where(i => i.UserId == user.UserId).Single());

而不是

Users.Remove(user);

现在当我在删除命令计数用户为负一但应用程序失败后调试代码时

对象引用未设置为对象的实例。

public User CurrentSelectedUser
    {
        get { return _user; }
        set
        {
            UserId = value.UserId;
            FirstName = value.FirstName;
            LastName = value.LastName;
            Username = value.Username;
            Password = value.Password;
            UserTypeId = value.UserTypeId;
            OnPropertyChanged("CurrentSelectedUser");
        }
    }

编辑:这是翻译错误吗?我注意到科里斯尼奇是波斯尼亚语的"用户"

什么是 ViewList.View 将 ItemsSource 绑定到?

无论如何,您可能将项目绑定到属性"用户",因此当您想要更新列表时调用 OnPropertyChanged("用户")。

但是,您要从"Korisnici"中删除用户:

// Refresh Listview-a after delete record.
Korisnici.Remove(user);
OnPropertyChanged("Users");

不是"用户"集合。 除非Korisnici.Move是您创建的方法?什么是科里斯尼奇?我想你想要:

// Refresh Listview-a after delete record.
Users.Remove(user);

请注意,您不需要 OnPropertyChanged("用户") - 它由 ObservableCollection 管理,它实现 INotifyCollectionChanged 本身以通知集合的更改。

"对象引用未设置为对象的实例"究竟在哪里?我怀疑它在这一行上:

UserId = value.UserId;

删除所选用户时,列表将更新(最后!Hurah) - 发生这种情况时,当前选定用户不再存在(它刚刚被删除),所以我怀疑绑定设置为 null。(未选择任何内容)。

这将调用 set{} 方法,值 = null。所以价值。用户标识;引发异常。

您需要像这样或类似方式处理设置为空的 CurrentSelectedUser:

public User CurrentSelectedUser
{
    get { return _user; }
    set
    {
        if (value != null)
        {
            UserId = value.UserId;
            FirstName = value.FirstName;
            LastName = value.LastName;
            Username = value.Username;
            Password = value.Password;
            UserTypeId = value.UserTypeId;
        }
        else
        {
             UserId = -1;// or other "NO USER" condition
             //etc etc
        }
        OnPropertyChanged("CurrentSelectedUser");
    }
}