【问题标题】:Sorting an ObservableCollection<T>对 ObservableCollection<T> 进行排序
【发布时间】:2014-07-25 00:34:59
【问题描述】:

我有一个UsersVM(复数)和一个UserVM(单数)。我在UsersVM 中创建了一个ObservableCollection&lt;UserVM&gt;。我将ObservableCollection&lt;UserVM&gt; 绑定到Listview。当我在列表视图中编辑用户时,我希望 ObservableCollection 根据用户状态重新排序。这是一些代码:

用户虚拟机:

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));
}

用户虚拟机:

public class UserVM: ViewModelBase
{
    public UserVM()
    {
    }

    public int UserID{ get; set; }
}

因此,如果我更改单个用户的状态,我希望 UserList 根据用户状态来使用。我已经读过ObservableCollection 可以重新排序的唯一方法是实现一些排序算法,但即使那样你也需要添加、删除或移动某些东西来改变它?我将其解读为:如果我想查看重新订购的ObservableCollection,那么我需要添加、删除或移动。我试过UserList.Move(1,2);,但没有奏效。我试过UserList.Add(TestUserObject);,但没有用。

【问题讨论】:

    标签: wpf sorting observablecollection


    【解决方案1】:

    这是我想要对 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>()); }
    }
    

    【讨论】:

    • “Live Shaping”也值得一看。
    • 很抱歉,您能否再澄清一下您的示例?我只是对您使用的命名约定感到困惑。我在哪里使用 BindToMe ?
    • 更改您的 ListView ItemsSource 绑定以绑定到 BindToMe
    • 好的,但我看不到 _bindToMe 实例化的位置。它是什么类型,该部分如何工作??
    • 您实际上从未直接绑定到 ObservableCollection,您始终绑定到 ICollectionView,所有这些代码所做的只是检索对视图的引用,默认情况下,您绑定到并添加排序描述给它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多