编辑项目的属性后对ObservableCollection进行排序

时间:2018-09-20 10:51:37

标签: c# wpf datagrid prism observablecollection

我正在尝试将ObservableCollection<T>绑定到WPF中的DataGrid。 在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 :(得分:0)

我认为问题在于CollectionView不会从其元素侦听PropertyChanged-Events,而且RaisePropertyChanged(nameof(this.Bilder));也不起作用,因为CollectionView并未真正更改。

我建议通过CollectionViewSource.GetDefaultView(list)在代码中创建CollectionView。因此,您可以从模型中控制CollectionView并在需要时调用ICollectionView.Refresh

答案 1 :(得分:0)

在“方法”中,创建一个新的集合并将其添加到“ 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));
    }
}