Datagrid RowDetails未更新

时间:2012-11-07 20:54:23

标签: c# wpf xaml mvvm wpfdatagrid

在修改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的问题?

2 个答案:

答案 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。