Рекомендуемый способ выполнения кода при изменении CollectionView.SourceCollection - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть ObservableCollection элементов, которые я хочу представить одновременно в двух элементах управления: один для редактирования свойств для текущего выделения и добавления и удаления элементов, а другой для отображения всей коллекции с выделенным текущим выделением.

С этой целью я создаю CollectionViewSource, который привязывается к моим элементам, и привязывается к этому в моих элементах управления:

<UserControl>
  <UserControl.Resources>
    <CollectionViewSource x:Key="MyCollectionViewSource" Source="{Binding MyItems}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="MyProperty" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
  </UserControl.Resources>

  <Grid>
    <my:PropertiesControl TheItems="{Binding Source={StaticResource MyCollectionViewSource}}" >
    <my:DisplayControl TheItems="{Binding Source={StaticResource MyCollectionViewSource}}" >
  </Grid>
</UserControl>

Проблема в том, что в DisplayControl я хочу расположить элементы особым образом, который можетне указывается в XAML: размещение элемента зависит не только от его собственных свойств, но и от свойств других элементов в коллекции.Таким образом, мне нужно выполнить некоторый код изменения местоположения всякий раз, когда элементы добавляются или удаляются из коллекции, или когда изменяются свойства одного из элементов в коллекции.

Мне было интересно, каков рекомендуемый способ сделать это?Вдохновленный ItemsControl.ItemsSource Я думал о том, чтобы сделать свойства TheItems типа IEnumerable, но мне сложно понять, как действовать.

Любой вклад будет оценен!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

У вас уже не реализована сортировка с использованием MyProperty? Почему вы не можете использовать Myproperty, который может содержать некоторый вычисленный порядок, который однозначно сортирует элементы, когда они добавляются / удаляются / редактируются.

Я имею в виду с точки зрения модели, которую вы всегда знаете , когда элемент добавляется и удаляется (с помощью обработчика ObservableCollection.CollectionChanged) или редактируется (с использованием обработчика INotifyPropertyChanged.PropertyChanged каждого элемента в вашем списке). Поэтому, когда вы обрабатываете эти события, вам придется обновить ваш MyProperty, который будет содержать значение для каждого элемента, чтобы переупорядочение происходило в соответствии с ожидаемой логикой.

0 голосов
/ 03 ноября 2011

в коде для вашего элемента управления отображением, который, как я полагаю, является пользовательским элементом управления вашего собственного творения, вы можете получить «TheItems» и переупорядочить их по своему содержанию… так как вы используете ObservableCollection, вы можете «прикрепить»"к событию CollectionChanged и проверьте условие (см. передаваемые аргументы события), что новые элементы добавляются / удаляются и переупорядочиваются в это время.

...