сортировка элементов в stackpanel WPF

У меня есть stackpanel с некоторыми usercontrols, которые добавлены или удалены во время времени выполнения. Эти элементы имеют индекс, который я присваиваю им, когда я новый их, я должен сохранить эти элементы отсортированными по тому индексу так я wote функция quicksort, которая сортирует их на основе индекса, но на строке, которая делает свопинг

          y = items[i]; //y is a temp variable
          items[i] = items[j];

Я добираюсь

"Указанный индекс уже используется. Разъедините Визуального ребенка в указанном индексе сначала"

Я пытался копировать их во временную переменную, удалите их из набора и затем присвойте их их правильному индексу с функцией Вставки в UIElementCollection, но затем я Добираюсь

"Указанный Визуальный уже ребенок другого Визуального или корень CompositionTarget"

Существует ли элемент клона, в котором я нуждаюсь или что-то, что я пропускаю где-нибудь?

7
задан irco 3 March 2010 в 17:10
поделиться

3 ответа

Почему бы вам не использовать ListBox / ItemsSontrol и не использовать CollectionViewSorce / SortDescription для выполнения этой работы. Добавление элементов в панели LayOut, например stackpanel, не является эффективным способом использования приложений WPF. StackPanel с вертикальной ориентацией используется по умолчанию для ListBox / ItemsControl, но если вам нужен другой макет, вы всегда можете переопределить ListBox.ItemsPanel Template

Если вы можете следовать MVVM apporach, то это вопрос указания свойство (в вашем случае это будет Index ) в вашем классе ViewModel и установка SortDescription на уровне listBox автоматически предоставит вам эту функцию. Вместо добавления и удаления фактических элементов UIElements вам нужно просто добавить / удалить привязку ObservableCollection к ListBox.ItemsSource. И укажите правильный 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}}"/>

примечание: <- xmlns: scm = "clr-namespace: System.ComponentModel; assembly = WindowsBase" ->

11
ответ дан 6 December 2019 в 12:48
поделиться

Если вы хотите это сделать, вам нужно убедиться, что родительский элемент имеет значение NULL, а также что ваш индекс в вашей панели не используется.

Если вы просто замените его временной переменной, это все та же ссылка.

Используйте Visual Tree Helper, чтобы отключить или переместить UIElement.

1
ответ дан 6 December 2019 в 12:48
поделиться

если вы дадите каждому элементу специфическое имя (которое является индексом). Когда вы удалите этот элемент управления, вы можете просто переименовать элементы управления результатами.

после этого все ваши элементы управления будут отсортированы.

0
ответ дан 6 December 2019 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: