在WinRT中排序ObservableCollection时遇到麻烦

时间:2014-01-27 09:43:22

标签: listview c#-4.0 windows-runtime winrt-xaml observablecollection

我需要按照xaml winRT中的starttime排序包含会议的列表视图。 我将会议列表绑定到UI。 我们不能在WinRT中使用排序描述,所以我试图对我的会议模型的ObservableCollection进行排序。 这是我的代码:

myMeetings.xaml:

<ListView x:Name="myMeetingsList"    
                ItemsSource="{Binding SortedData}"....

myMeetings.xaml.cs

    public ObservableCollection<T> SortedData
    {
        get {return _sortedData; }
        protected set {Sort();}
    }

    public void Sort() {
        _sortedData = new ObservableCollection<T>(_myMeetings.OrderBy(a=>a.startTime));
    }

当我尝试显示已排序的会议列表时。它没有显示任何内容。 我一定做错了什么。有什么建议??

2 个答案:

答案 0 :(得分:1)

您需要确定属性SortedItems已更改。您需要举起NotifyPropertyChanged事件。否则,引擎不知道您已将列表更改为新实例。

或者,将新排序的项目复制到新清除的_sortedData实例中。只是不要创建一个全新的实例。

答案 1 :(得分:0)

您不希望SortDescriptions是WinRT CollectionViewSource的一部分吗?哦,伙计,我知道。过滤器和组也是如此。但是,不需要那个谈话;它就是它。

对ObservableCollection进行排序就像排序其他任何事情一样,只需要确保不要仅重置其成员的集合值。像这样:

var o = new ObservableCollection<int>();

// fill collection ascending
var n = Enumerable.Range(1, 50);
foreach (var item in n)
    o.Add(item);

n = n.Reverse();
// fill collection descending
o.Clear();
foreach (var item in n)
    o.Add(item);

您是否必须在代码隐藏中完成所有这些操作?实际上,是的。你可以在附加的属性或其他东西上添加一些东西,但这只是一些非常简单的代码。

由于您再次呼叫Clear()而未将o设置为new ObservableCollection<int>(),因此用户界面会跟上您的更改。所以不需要额外的活动或其他什么。

剩下的问题是应该调用排序。这将根据具体情况而定。而且,只有你知道你的应用程序。更改X数据后,调用Sort()。

话虽如此,如果您认为X的值会经常更改,那么您可能希望使用Reactive Extensions来限制事件。如果它不常见,那么不要介意那部分。

如何对可观察的集合进行排序?

如果你看一下这样做的解决方案。他们只是在上面的代码中做我正在做的事情。它们只是Observable Collection的子类。这些都值得这么简单吗?也许。你可以决定。但它都在做同样的事情。我的推荐,少即是多。

祝你好运!