2014-04-04 20 views
0

原來這是令人驚訝的難以從一個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

您更改Status,但您綁定整個Booking對象,這意味着它只會在整個對象更改時觸發,而不會在該對象內的任何屬性更改時觸發。綁定Status代替

<Binding Path=Status, Converter="{StaticResource BookingBackgroundConverter}" /> 

和變化轉換到您預訂的狀態,而不是Booking對象工作。如果您需要傳遞多個值,請使用IMultiValueConverterMultiBinding

+0

這實際上並不奏效,但教導我需要在單個值轉換器中指定路徑時使用+1 - 我認爲它自動推斷出這一點。 –

+0

什麼不起作用?當狀態值改變時轉換器仍不會被調用? 'Booking'類是否實現了'INotifyPropertyChanged'? – dkozl

+0

不,預訂不會實現INotifyPropertyChanged。它是一個實體框架類。在其他地方,這並沒有成爲問題,因爲我一直在向ViewModel添加INotfiyPropertyChanged並通過它暴露對象。我不明白爲什麼預訂情況更新,當電網雖然編輯,但不是按一下按鈕 –

相關問題