我正在使用基本的CRUD功能开发WPF MVVM应用程序。我使用包含和显示用户数据的ListView。当我添加或更新一些用户ListVew立即刷新,但删除命令后ListView不刷新。在这种情况下,我必须关闭应用程序并再次运行以刷新ListView。
<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");
}
}
答案 0 :(得分:1)
我添加了这一行
Users.Remove(Users.Where(i => i.UserId == user.UserId).Single());
而不是
Users.Remove(user);
现在当我在删除命令计数用户之后调试代码为负1但是应用程序失败时
未将对象引用设置为对象的实例。
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");
}
}
答案 1 :(得分:0)
修改:这是翻译错误吗?我注意到Korisnici是用户&#34;
的bosnian什么是ViewList.View,您将ItemsSource绑定到?
无论如何,您可能会将项目绑定到属性&#34;用户&#34;,因此当您想要更新列表时,为什么要调用OnPropertyChanged(&#34;用户&#34;)。
但是,您要从&#34; Korisnici&#34;
中删除用户// Refresh Listview-a after delete record.
Korisnici.Remove(user);
OnPropertyChanged("Users");
不是&#34;用户&#34;采集。除非Korisnici.Remove是你创建的方法?什么是Korisnici?我想你想要:
// Refresh Listview-a after delete record.
Users.Remove(user);
注意,您不需要OnPropertyChanged(&#34;用户&#34;) - 这是由ObservableCollection管理的,它实现了INotifyCollectionChanged本身以通知集合的更改。
答案 2 :(得分:0)
“对象引用未设置为对象的实例”究竟在哪里?我怀疑它就在这条线上:
UserId = value.UserId;
当您删除所选用户时,列表会更新(最后!Hurah) - 当发生这种情况时,CurrentSelectedUser不再存在(它刚被删除)所以我怀疑绑定设置为null。 (没有选择)。
使用value = null调用set {}方法。所以value.UserId;抛出异常。
您需要将CurrentSelectedUser设置为null,如下所示:
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");
}
}