我有C#\ WPF应用程序,它只是在列表框控件中显示一个变量名称及其值的列表。当用户点击刷新按钮时,该列表将被重新创建,并为变量创建新的值。一些变量可能已经改变,而有些变量保持不变。需要关于字符串排序列表的一些想法
我希望自上次刷新以来已更改的值位于列表框的顶部,但无法想到一个优雅的方式来解决此问题。任何想法或例子将不胜感激。
谢谢!
我有C#\ WPF应用程序,它只是在列表框控件中显示一个变量名称及其值的列表。当用户点击刷新按钮时,该列表将被重新创建,并为变量创建新的值。一些变量可能已经改变,而有些变量保持不变。需要关于字符串排序列表的一些想法
我希望自上次刷新以来已更改的值位于列表框的顶部,但无法想到一个优雅的方式来解决此问题。任何想法或例子将不胜感激。
谢谢!
而不是具有作为名称/值对的对象的列表,请将其视为具有Name
/Value
/IsChanged
属性的对象的列表。更新对象列表时,您可以适当地设置IsChanged
,并将IsChanged
用作排序的一部分。
特别是,不要认为这是对字符串列表进行排序。你有一个变量列表,它有属性(name
,value
,isChanged
)。您的列表框绑定到CollectionView
(Listbox.Items
给你的那个,或者你从CollectionViewSource
得到的那个)。那CollectionView
有SortDescriptions
就可以了,你可以先设置IsChanged
,然后按Name
排序。
如果给你的列表项目(模型)一些额外的功能,以便简单地服务视图,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}}"/>
假设您的模型实现INotifyPropertyChanged
和ListOfModels
是ObservableCollection
,这一切都将采取自动排序完成。
可能有更多的选择:
Except
来查看差异。在顶部创建一个新的列表,其结果为Except
,其余顺序如下。Timestamp
,这将标记,项目创建时。选择一个时间间隔,如何旧的项目应该在最上面。读取新的值,并且满足条件的那些(间隔中的最新值)置于顶部。或者你可以按TimeStamp
排序。使用类似:
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);
我没有测试代码,咬了想法应该很清楚。
我喜欢杰夫的想法,但它需要额外的逻辑在每次用户更新列表时重置IsChanged值。尝试为您的名称/值对添加时间戳,并在每次更新值时更新时间戳。然后,只需将时间戳添加到您的排序。
用javascript存储当前值,并与新值进行比较。如果不同,请将它们放在堆栈顶部。如果没有,将它们放在底部。 –
你的数据结构是什么样的? –
乔为什么要用javascript来存储这些值,例如他可以做'List .Sort()'例如..?不是一个好的建议btw –
MethodMan