簡體   English   中英

WPF DataGrid編輯后更新單元格樣式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM