列表视图删除刷新不起作用
本文关键字:不起作用 刷新 删除 视图 列表 | 更新日期: 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");
}
}