对ObservableCollection <t> </t>进行排序

时间:2014-07-25 00:34:59

标签: wpf sorting observablecollection

我有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);但是没有用。

1 个答案:

答案 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>()); }
}
相关问题