【发布时间】:2014-05-15 14:12:47
【问题描述】:
我在 MVVM 应用程序内的 WPF 表单上有一个可编辑的数据网格。
用户可以在此页面上执行两种可能的操作,这些操作会导致其中一行中的某些数据发生更改。其中一个可编辑字段 - 已请求 - 可能会导致另一个属性发生更改,并且有一个样式触发器取决于其值:
public bool OverRequested
{
get
{
if(this.Requested > this.Volume)
{
return true;
}
return false;
}
}
在 XAML 中:
<DataGridTextColumn Header="Requested" Binding="{Binding Requested}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding OverRequested}" Value="true">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="ToolTip" Value="The requested volume is greater than the available volume" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
另一个是更新行后面的数据项并更改该项上的值的按钮。
虽然数据网格本身会响应更改 - 如果您从底层 ObservableCollection 添加或删除行,它会在 UI 中相应更新 - 对行下方项目的这些属性的更改不会更新。
我知道这是设计使然,因为 observableCollection 中的项目的更改不会冒泡,并且必须特别注意,但我正在努力找出如何实现我想要的。
我已经尝试过 - 正如其他地方所建议的那样 - 覆盖 ObservableCollection 上 CollectionChanged 的事件处理程序,以向其中的项目添加通知警报:
private void ObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (var item in e.NewItems)
{
(item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
}
}
}
但是里面的项目没有实现 INotifyPropertyChanged 接口——它们是实体框架对象而不是 ViewModel。所以演员表失败了。
有什么方法可以实现吗?由于只有两个属性要查看,我很乐意手动进行 - 但即使调用 OnPropertyChanged("") 来更新 ViewModel 中的所有属性也不会导致数据网格内的属性刷新。
【问题讨论】: