2013-01-31 31 views
1

我有C#\ WPF应用程序,它只是在列表框控件中显示一个变量名称及其值的列表。当用户点击刷新按钮时,该列表将被重新创建,并为变量创建新的值。一些变量可能已经改变,而有些变量保持不变。需要关于字符串排序列表的一些想法

我希望自上次刷新以来已更改的值位于列表框的顶部,但无法想到一个优雅的方式来解决此问题。任何想法或例子将不胜感激。

谢谢!

+0

用javascript存储当前值,并与新值进行比较。如果不同,请将它们放在堆栈顶部。如果没有,将它们放在底部。 –

+0

你的数据结构是什么样的? –

+0

乔为什么要用javascript来存储这些值,例如他可以做'List .Sort()'例如..?不是一个好的建议btw – MethodMan

回答

1

而不是具有作为名称/值对的对象的列表,请将其视为具有Name/Value/IsChanged属性的对象的列表。更新对象列表时,您可以适当地设置IsChanged,并将IsChanged用作排序的一部分。

特别是,不要认为这是对字符串列表进行排序。你有一个变量列表,它有属性(name,value,isChanged)。您的列表框绑定到CollectionViewListbox.Items给你的那个,或者你从CollectionViewSource得到的那个)。那CollectionViewSortDescriptions就可以了,你可以先设置IsChanged,然后按Name排序。

2

如果给你的列表项目(模型)一些额外的功能,以便简单地服务视图,viewmodel样式是最好的 - 当然如果你想让它们保持纯粹的,你可以将你的模型包装在viewmodels中。例如,你可以给你的模型一个Changed属性,你可以设置它(或者,Value属性设置器可以在值改变时自动改变它)。那么这个属性可以使用排序集合以便在ListBox对项目进行排序,该框绑定到:

<CollectionViewSource x:Key="SortedModels" Source="{Binding ListOfModels}"> 
    <CollectionViewSource.SortDescriptions> 
     <SortDescription PropertyName="Changed"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<ListBox ItemsSource="{Binding Source={StaticResource SortedModels}}"/> 

假设您的模型实现INotifyPropertyChangedListOfModelsObservableCollection,这一切都将采取自动排序完成。

1

可能有更多的选择:

  1. 保持当前列表的状态。加载新列表。使用linq Except来查看差异。在顶部创建一个新的列表,其结果为Except,其余顺序如下。
  2. 扩大您的项目与Timestamp,这将标记,项目创建时。选择一个时间间隔,如何旧的项目应该在最上面。读取新的值,并且满足条件的那些(间隔中的最新值)置于顶部。或者你可以按TimeStamp排序。
1

使用类似:

var olditems = new Hashset<string>(listbox.items); // or List<T> 
List<string> newitems = getNewItems(); 
newitems = newitems.RemoveAll(x => olditems.Contains(x)); 
listbox.Items.Clear(); 
listbox.Items.Add(newitems); 
listbox.Items.Add(olditems); 

我没有测试代码,咬了想法应该很清楚。

参见:Using LINQ to remove elements from a List<T>

0

我喜欢杰夫的想法,但它需要额外的逻辑在每次用户更新列表时重置IsChanged值。尝试为您的名称/值对添加时间戳,并在每次更新值时更新时间戳。然后,只需将时间戳添加到您的排序。

相关问题