我有C#\ WPF应用程序,它只是在列表框控件中显示变量名称及其值的列表。当用户点击“刷新”按钮时,将使用变量的新值重新创建列表。一些变量可能已经改变,而一些变量保持不变。
我希望自上次刷新以来已更改的值位于列表框的顶部,但无法想到一个优雅的方法来解决这个问题。任何想法或例子都将不胜感激。
谢谢!
答案 0 :(得分: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}}"/>
假设您的模型实现INotifyPropertyChanged
而ListOfModels
是ObservableCollection
,那就是自动完成排序所需的一切。
答案 1 :(得分:1)
不要使用名称/值对的对象列表,而应将其视为具有Name
/ Value
/ IsChanged
属性的对象列表。更新对象列表时,您可以适当地设置IsChanged
,并在您的排序中使用IsChanged
。
特别是,不要将此视为排序字符串列表。您有一个变量列表,其中包含属性(name
,value
,isChanged
)。您的列表框绑定到CollectionView
(Listbox.Items
为您提供的,或者您从CollectionViewSource
获得的内容)。 CollectionView
上有SortDescriptions
个IsChanged
,您可以先设置Name
,然后按{{1}}排序。
答案 2 :(得分:1)
可能有更多选择:
Except
查看差异。创建新列表,其中包含顶部Except
和下面其余订单的结果。Timestamp
扩展您的项目,该项目将在项目创建时进行标记。选择一个间隔,旧项应该如何位于顶部。读取新值,并将满足条件的值(区间中的最新值)置于顶部。或者您可以按TimeStamp
。答案 3 :(得分: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);
我没有测试过代码,这个想法应该变得清晰。
答案 4 :(得分:0)
我喜欢Jeff的想法,但每次用户更新列表时都需要额外的逻辑来重置IsChanged值。尝试在名称/值对中添加时间戳,并在每次更新值时更新时间戳。然后只需添加时间戳即可。