[英]WPF DataGrid updating cell style after editing
在XAML中,我在DataGrid中有一列定義如下:
<DataGridTextColumn Header="Name" Binding="{Binding Name}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" >
<Setter Property="Background" Value="{Binding Converter={StaticResource NameToBrushConverter}}"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
當“名稱”列和“名字”列具有相同的內容時,NameToBrushConverter返回一種顏色。 否則,它將返回DependencyProperty.UnsetValue。
我面臨的問題是,如果我編輯單元格並結束編輯,則樣式不會更新。 僅當新輸入的值移動到另一行(由於排序)時,才應用背景的有條件着色。 但是,如果在編輯后對象顯示在數據網格的同一行中,則直到我單擊排序后,背景顏色才會更新。 單元格移動到另一行后,背景將根據Converter值進行更新。
為該對象實現INotifyPropertyChanged並沒有幫助。
有沒有一種方法可以告訴GridView在編輯單元格后必須重新評估樣式?
dataGrid.Items.Refresh();
調用刷新有幫助,但是哪個事件觸發刷新? 我在CellEditEnding中嘗試過,但是出現了一個異常“ AddNew或EditItem事務中不允許刷新”。
1)您需要將UpdateSourceTrigger設置為PropertyChanged,因為默認情況下它在DataGrid中設置為LostFocus。
2)我猜您沒有CellEditTemplate。
3) 這是最大的問題。您必須使用相關的Converter對屬性進行多重綁定。 現在這樣做的唯一原因是,當失去焦點時,當前單元格中的綁定將刷新,並使您的項(即綁定或綁定到Path =。)將其傳遞到轉換器並輸出某種顏色。
編輯:
我知道我將UpdateSourceTrigger放在錯誤的綁定上。 將其放在上方的名稱上,並在您的單元格樣式中也綁定到名稱。
XAML:
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" >
<Setter Property="Background" Value="{Binding Name ,Converter={StaticResource NameToBrushConverter}}"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
此外,關於您的以下問題。 當在行之間移動時,它部分起作用的唯一原因是因為嵌套在DataGrid中的每個綁定都具有默認的UpdateSourceTrigger。 這是LostFocus。
當使用綁定到當前DataContext時
<SomeElement Tag={Binding} />
Or
<SomeElement Tag={Binding Path=.} />
您沒有綁定到屬性。
在以下情況下評估綁定:
1)DependencyObject初始化,並評估其所有DP。 它第一次獲得了價值。
2)UpdateSourceTrigger = LostFocus(DataGrid內部的默認值),它最終出現在LostFocus上。 這就是為什么在行之間傳遞時評估綁定的原因。
3)UpdateSourceTrigger =屬性更改。 如果您不想在數據上下文中使用它,則必須顯式設置一個屬性,該屬性將返回自身並在name屬性更改時調用它。
像這樣的東西:
CS:
public class Entity : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
PropertyChanged(this, new PropertyChangedEventArgs("Self"));
}
}
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
PropertyChanged(this, new PropertyChangedEventArgs("Self"));
}
}
public Entity Self
{
get { return this; }
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
XAML:
<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" >
<Setter Property="Background" Value="{Binding Self,Converter={StaticResource NameToBrushConverter}}"/>
</Style>
但這不會在LostFocus上進行評估,但是您將不需要任何方式,因為它將首先評估,然后對名稱進行任何更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.