原來這是令人驚訝的難以從一個ObservableCollection內的項目泡了性質的變化 - 在默認情況下它只是提出改變事件時,集合本身被修改,而不是在它的項目。WPF - 內部數據網格的價值無法更新轉換器外部更改
這個蘇答案(到我的另一問題,關於這個問題的)建議,一個倒過來的問題是使用轉換器:
WPF MVVM - Datagrid does not update changed properties of child items
而對於我的方案之一,其中的風格一個項目取決於它的值,並且該值可以通過編輯DataGrid的用戶進行更改,它的工作原理非常漂亮。
然而,在同一個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();
}
}
順便說一句我感到驚訝的是進入該轉換器的價值竟然是一個預訂 - 這是什麼行必然,而不是*列 - 我期待得到狀態的字符串值。知道這是爲什麼會有用,因爲它可能會影響答案。
總之,這裏的改變狀態的按鈕,點擊命令:
private void BookCount()
{
SelectedBooking.Status = "Booking";
rep.SaveChanges();
OnPropertyChanged("");
}
SelectedBooking是保存當前所選行的屬性。我絕望地解僱了一個空的OnPropertyChanged,試圖讓它更新。
,但沒有喜悅 - 轉換代碼不被打到,直到查看重載。爲什麼轉換器的方法適用於數據網格編輯,但不是按鈕點擊,以及我能做些什麼來獲得按鈕點擊以直觀地更新狀態列?
這實際上並不奏效,但教導我需要在單個值轉換器中指定路徑時使用+1 - 我認爲它自動推斷出這一點。 –
什麼不起作用?當狀態值改變時轉換器仍不會被調用? 'Booking'類是否實現了'INotifyPropertyChanged'? – dkozl
不,預訂不會實現INotifyPropertyChanged。它是一個實體框架類。在其他地方,這並沒有成爲問題,因爲我一直在向ViewModel添加INotfiyPropertyChanged並通過它暴露對象。我不明白爲什麼預訂情況更新,當電網雖然編輯,但不是按一下按鈕 –