Я пытаюсь связать ObservableCollection<T>
с DataGrid
в WPF.Ниже DataGrid
есть поля для редактирования выбранного в данный момент элемента из DataGrid
, например:
Итак, общий 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 при изменении заказа?
Заранее спасибо