ListView删除刷新不起作用?

时间:2016-02-08 09:35:34

标签: c# wpf mvvm refresh

我正在使用基本的CRUD功能开发WPF MVVM应用程序。我使用包含和显示用户数据的ListView。当我添加或更新一些用户ListVew立即刷新,但删除命令后ListView不刷新。在这种情况下,我必须关闭应用程序并再次运行以刷新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

MODEL

public CollectionViewSource ViewList { get; set; }

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

3 个答案:

答案 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");
    }
}