Сортировка ObservableCollection после редактирования свойства элемента - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь связать ObservableCollection<T> с DataGrid в WPF.Ниже DataGrid есть поля для редактирования выбранного в данный момент элемента из DataGrid, например:

enter image description here

Итак, общий Tиз ObservableCollection<T> имеет следующие свойства: - Заголовок (Überschrift) - Описание (Beschreibung) - Путь (Pfad)

, а также имеет свойство Reihenfolge, что означает Order.

С помощью желтых стрелок я хочу изменить порядок записей.

К сожалению, ObservableCollection не имеет OrderBy -метода ...


Я пробовал следующее:

В XAML я определил CollectionViewSource следующим образом:

<CollectionViewSource Source="{Binding Bilder}" x:Key="Pictures">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Reihenfolge" />
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

И я связал DataGrid с этим CollectionViewSource

<DataGrid Grid.Column="0" Grid.Row="1"
          Name="PictureDataGrid"  
          ItemsSource="{Binding Source={StaticResource Pictures}}"
          AutoGenerateColumns="False" 
          IsReadOnly="True" 
          CanUserAddRows="false" 
          SelectedItem="{Binding SelectedBild}"  
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch">
 ...

В ViewModel у меня есть эти свойства:

public ObservableCollection<BildNotifiableModel> Bilder { get; set; }
public BildNotifiableModel SelectedBild { get; set; }

и два метода, которые вызываются с DelegateCommands, которые обновляют порядок

 private void MoveSeiteUp()
 {
     const int smallestReihenfolge = 1;
     if (this.SelectedBild.Reihenfolge > smallestReihenfolge) {
            var bildToSwapReihenfolgeWith = this.Bilder.Single(b => b.Reihenfolge == this.SelectedBild.Reihenfolge - 1);
            this.SelectedBild.Reihenfolge--;
            bildToSwapReihenfolgeWith.Reihenfolge++;

            RaisePropertyChanged(nameof(this.Bilder));
        }
    }

    private void MoveSeiteDown()
    {
        if (this.SelectedBild.Reihenfolge < MaxAllowedImages) {
            var bildToSwapReihenfolgeWith = this.Bilder.Single(b => b.Reihenfolge == this.SelectedBild.Reihenfolge + 1);
            this.SelectedBild.Reihenfolge++;
            bildToSwapReihenfolgeWith.Reihenfolge--;

            RaisePropertyChanged(nameof(this.Bilder));
        }
    }

Порядок обновляется правильно, но, к сожалению, представление не отражает изменений ... только после закрытия и повторного открытия представления записи в DataGrid находятся вПравильный порядок.

  • Что я здесь не так делаю?
  • Как мне сделать обновление DataGrid при изменении заказа?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В ваших методах создайте новую коллекцию и добавьте ее в «Bilder».Просто поднятие PropertyChanged выполнит оценку для ссылочного равенства.Если это то же самое - что это будет, если вы просто перемещаете элементы внутри - он не будет обновлять DataGrid.

Если вы не используете атрибуты ObservableCollections, такие как автоматическое обновление, когда элементы добавляются илиудалены, вы также можете изменить его на «обычный» список.

private void MoveSeiteUp()
{
 const int smallestReihenfolge = 1;
 if (this.SelectedBild.Reihenfolge > smallestReihenfolge) {
        var bildToSwapReihenfolgeWith = this.Bilder.Single(b => b.Reihenfolge == this.SelectedBild.Reihenfolge - 1);
        this.SelectedBild.Reihenfolge--;
        bildToSwapReihenfolgeWith.Reihenfolge++;

        this.Bilder = new ObservableCollection<BildNotifiableModel> (this.Bilder);

        RaisePropertyChanged(nameof(this.Bilder));
    }
}

private void MoveSeiteDown()
{
    if (this.SelectedBild.Reihenfolge < MaxAllowedImages) {
        var bildToSwapReihenfolgeWith = this.Bilder.Single(b => b.Reihenfolge == this.SelectedBild.Reihenfolge + 1);
        this.SelectedBild.Reihenfolge++;
        bildToSwapReihenfolgeWith.Reihenfolge--;

        this.Bilder = new ObservableCollection<BildNotifiableModel> (this.Bilder);

        RaisePropertyChanged(nameof(this.Bilder));
    }
}
0 голосов
/ 20 сентября 2018

Я думаю, что проблема в том, что CollectionView не прослушивает PropertyChanged-Events из его элементов, а также RaisePropertyChanged(nameof(this.Bilder)); не работает, потому что CollectionView на самом деле не изменяется.

Я бы рекомендовал:создайте CollectionView в коде через CollectionViewSource.GetDefaultView(list).Таким образом, вы можете управлять CollectionView с вашей модели и вызывать ICollectionView.Refresh, если необходимо.

...