【发布时间】:2016-05-17 22:01:42
【问题描述】:
我正在开发具有基本 CRUD 功能的 WPF MVVM 应用程序。我使用包含和显示用户数据的 ListView。当我添加或更新某些用户时 ListVew 会立即刷新,但在 Delete 命令后 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
型号
public CollectionViewSource ViewList { get; set; }
public ObservableCollection<User> Users
{
get
{
return _users;
}
set
{
_users = value;
OnPropertyChanged("Users");
}
}
【问题讨论】:
-
ItemsSource="{Binding ViewList.View, UpdateSourceTrigger=PropertyChanged, IsAsync=True,ModeTwoWay}"
-
试试这个 ViewList.View.Refresh();行后 OnPropertyChanged("Users");
-
我没有尝试任何事情发生,当我在 ItemSource 中插入 Mode=TwoWay 作为您的第一条评论时,我收到错误:TwoWay 或 OneWayToSource 绑定无法在“System”类型的只读属性“View”上工作。 Windows.Data.CollectionViewSource'。
-
在代码中删除用户后你的列表ViewList是否改变
-
带断点的检查清单