irc*_*rco 7 c# sorting wpf stackpanel
我有一个stackpanel,其中包含一些在运行时添加或删除的用户控件.这些元素有一个索引,当我新建它时,我需要保留这些元素,我需要保持这些元素按索引排序,所以我做了一个快速排序函数,根据索引对它们进行排序,但是在交换的行上
y = items[i]; //y is a temp variable
items[i] = items[j];
Run Code Online (Sandbox Code Playgroud)
我明白了
"指定的索引已在使用中.首先断开指定索引处的Visual子节点"
我尝试将它们复制到临时变量,从集合中删除它们然后使用UIElementCollection中的Insert函数将它们分配到它们的右侧索引,但后来我得到了
"指定的Visual已经是另一个Visual的子项或CompositionTarget的根"
是否有我需要的克隆元素或某些东西在某处丢失?
Job*_*Joy 11
为什么不使用ListBox/ItemsSontrol并使用CollectionViewSorce/SortDescription来完成这项工作.将元素添加到LayOut面板(如stackpanel)不是一种有效的WPF应用程序.具有垂直方向的StackPanel是ListBox/ItemsControl的默认设置,但如果您想要一些不同的布局,则可以始终覆盖ListBox.ItemsPanel模板
如果您可以关注MVVM apporach,那么在ViewModel类中指定属性(在您的情况下它将是Index)并在listBox级别设置SortDescription将自动为您提供此功能.您只需添加/删除ObservableCollection绑定到ListBox.ItemsSource,而不是添加和删除实际的UIElements.并指定正确的DataTemplate.
如果您不熟悉CollectionViewSource,请检查此项 - http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.sortdescriptions.aspx
代码将更像下面..它非常简单.
<UserControl.Resources>
<CollectionViewSource x:Key="sourceCollection" Source="{Binding YourObservableCollectionProperty}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="YourProperty-Index"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</UserControl.Resources>
<ItemsControl ItemsSource="{Binding Source={StaticResource sourceCollection}}"/>
Run Code Online (Sandbox Code Playgroud)
注意:< - XMLNS:SCM = "CLR-命名空间:System.ComponentModel程序;装配= WindowsBase" - >
上面的答案是正确的,但是如果你不能改变你的堆栈面板(如果你没有足够的时间,或者已经写了很多与堆栈面板相关的代码)试试这个:
注意:代码正在运行,Remove 函数从 StackPanel 项的(从树中)删除控件,但控件已经在内存中,以便控件能够插入任何 StackPanel 或相同的 StackPanel。
归档时间: |
|
查看次数: |
8713 次 |
最近记录: |