我正在尝试将ObservableCollection<T>
绑定到WPF中的DataGrid
。
在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中的条目才以正确的顺序显示。
预先感谢
答案 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));
}
}