在修改RowDetailsTemplate
绑定的集合(“Items”)时,我遇到了更新DataGrid
的问题。正在视图模型中修改集合。当我修改其中一个绑定项的内容时,更改将在DataGridRow和RowDetailsTemplate中更新。 E.g。
Items[i].Name = "new name"; // RowDetailsTemplate gets updated
但是如果我将其中一个项目分配给一个全新的对象,DataGridRow会更新,但RowDetailsTemplate不会更新。 E.g。
Items[i] = new Model {Name = "new name"}; // RowDetailsTemplate NOT updated
我首先想到的唯一事情是我需要为绑定Items的CollectionChanged事件添加一个侦听器,并显式引发属性更改通知。 E.g
Items = new ObeservableCollection<Model>();
Items.CollectionChanged += (o,e) => OnNotifyPropertyChanged("Items");
但这没效果。
我的XAML绑定如下所示:
<DataGrid DataContext="{StaticResource viewmodel}"
ItemsSource="{Binding Items, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
为什么DataGridRow
已通知已更改的项目但未通知RowDetailsTemplate
?
更新的 执行删除/添加而不是修改集合。 E.g。
Items.Remove(Items[i]);
Items.Add (new Model {Name = "new name"}); // RowDetailsTemplate updated OK
(哦,Model类当然会实现INotifyPropertyChanged
。)
似乎这可能是我需要刷新详细信息视图的DataContext的问题?
答案 0 :(得分:1)
你为什么不能:
Items.RemoveAt(i);
Items.Insert(i,(new Model {Name = "new name"});
会产生同样的效果。
答案 1 :(得分:0)
我不得不在CellEditEnding处理程序代码中插入这样一个肮脏的黑客:
DataTemplate temp = ProfileDataGrid.RowDetailsTemplate;
ProfileDataGrid.RowDetailsTemplate = null;
ProfileDataGrid.RowDetailsTemplate = temp;
它有效,Row Detail已更新,但我也想知道主人如何更新RowDetails。