我有UsersVM
(复数)和UserVM
(单数)。我在ObservableCollection<UserVM>
中创建了UsersVM
。我将ObservableCollection<UserVM>
绑定到Listview
。当我在列表视图中编辑用户时,我希望ObservableCollection
根据用户状态重新排序。这是一些代码:
UsersVM:
public ObservableCollection<UserVM> UserList{ get; set; }
public UsersVM(IUserService userService)
{
this._userService = userService;
var users= userService.GetUsers();
var userViewModels = users.Select(x => new UserVM
{
UserID= x.UserID,
StatusID = x.StatusID,
Status = x.Status,
});
this.UserList= new ObservableCollection<UserVM>(userViewModels);
this.UpdateUserStatus= new RelayCommand<object[]>((s) => UpdateStatus(s));
}
UserVM:
public class UserVM: ViewModelBase
{
public UserVM()
{
}
public int UserID{ get; set; }
}
因此,如果我更改单个用户的状态,我希望UserList
根据用户状态求助。我已经读过ObservableCollection
可以重新排序的唯一方法是实现一些排序算法,但即便如此,你需要添加,删除或移动一些东西才能让它改变?我读到:如果我想看到我的重新订购ObservableCollection
,那么我需要添加,删除或移动。我试过了UserList.Move(1,2);
但这没效果。我试过了UserList.Add(TestUserObject);
但是没有用。
答案 0 :(得分:0)
这是我想要对ObservableCollection进行排序,分组和过滤时使用的模式。在这种情况下,您希望获取ObservableCollection的默认视图并向其添加排序说明。
protected ObservableCollection<UserVM> _users = new ObservableCollection<UserVM>();
protected ICollectionView _bindToMe;
public UsersVM()
{
_users.Add(new UserVM() {Status = "1"});
_users.Add(new UserVM() {Status = "3"});
_users.Add(new UserVM() {Status = "2"});
}
public ICollectionView BindToMe
{
get
{
if (_bindToMe == null)
{
_bindToMe = CollectionViewSource.GetDefaultView(_users);
_bindToMe.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending));
}
return _bindToMe;
}
}
然后您可以将ListView ItemsSource绑定更新为
<ListView ItemsSource="{Binding BindToMe}" />
绑定到集合的已排序视图
或者您可以将ObservableCollection暴露在ViewModel上,绑定到它并简单地将排序描述添加到ViewModel构造函数中的ObservableCollection。
protected ObservableCollection<UserVM> _users;
public UsersVM()
{
Users.Add(new UserVM() {Status = "1"});
Users.Add(new UserVM() { Status = "3" });
Users.Add(new UserVM() { Status = "2" });
var view = CollectionViewSource.GetDefaultView(_users);
view.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending));
}
public ObservableCollection<UserVM> Users
{
get { return _users ?? (_users = new ObservableCollection<UserVM>()); }
}