【发布时间】:2014-04-04 10:36:49
【问题描述】:
事实证明,从 ObservableCollection 中的项目中冒泡属性更改非常困难 - 默认情况下,它仅在修改集合本身时引发更改事件,而不是其中的项目。
这个 SO 答案(对我关于该主题的另一个问题)表明解决问题的一种方法是使用转换器:
WPF MVVM - Datagrid does not update changed properties of child items
对于我的一个场景,项目的样式取决于它的值,并且可以通过用户编辑 DataGrid 来更改该值,它工作得很好。
但是,在同一个 DataGrid 中,可以通过按下按钮来更新另一个字段 - 该按钮位于同一个 ViewModel 中,但它不属于 datagrid 本身。我尝试了一个类似的技巧来让它工作:
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background">
<Setter.Value>
<Binding Converter="{StaticResource BookingBackgroundConverter}" />
</Setter.Value>
</Setter>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
还有转换器:
public class BookingBackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Booking b = (Booking)value;
switch(b.Status)
{
case "Booking" :
return Brushes.LightBlue;
case "Booked" :
return Brushes.LightGreen;
default :
return Brushes.Transparent;
}
}
public object ConvertBack(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
顺便说一句,我很惊讶进入 Converter 的值竟然是一个 Booking - 这是 row 绑定的,而不是 *column - 我期望得到的字符串值地位。知道为什么会这样可能会很有用,因为它可能与答案有关。
无论如何,这是改变状态的按钮单击命令:
private void BookCount()
{
SelectedBooking.Status = "Booking";
rep.SaveChanges();
OnPropertyChanged("");
}
SelectedBooking 是一个包含当前选定行的属性。我绝望地发射了一个空的 OnPropertyChanged 来尝试更新它。
但没有乐趣 - 转换器代码在视图重新加载之前不会受到影响。为什么转换器方法适用于数据网格编辑而不是按钮点击,我可以做些什么来让按钮点击以直观地更新状态列?
【问题讨论】: