WPF DataGrid在编辑后更新单元格样式

时间:2015-08-30 12:01:48

标签: c# wpf xaml datagrid

在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在&#34; Name&#34;列和&#34; FirstName&#34;列具有相同的内容。否则返回DependencyProperty.UnsetValue。

我面临的问题是,如果我编辑单元格并结束编辑,则不会更新样式。仅当新输入的值移动到不同的行(因为排序)时才应用背景的条件着色。但是,如果在编辑对象后显示在datagrid的同一行中,则在我单击sort之前,背景颜色不会更新。一旦单元格移动到另一行,背景将根据转换器值进行更新。

为对象实现INotifyPropertyChanged并没有帮助。

有没有办法告诉GridView在编辑单元格后必须重新评估样式?

dataGrid.Items.Refresh();

调用刷新有帮助,但哪个触发刷新是正确的事件?我在CellEditEnding中尝试了它,但得到了一个异常&#34; AddNew-或EditItem事务中不允许刷新&#34;。

1 个答案:

答案 0 :(得分:3)

1)您需要将UpdateSourceTrigger设置为PropertyChanged,因为它默认设置为DataGrid中的LostFocus。

2)我猜你没有CellEditTemplate。

3)这是最大的问题您必须在属性上使用相关转化器的多重绑定。这个现在工作的唯一原因是因为当失去焦点时,当前单元格中的绑定会刷新并获取您的项目(即绑定或绑定到Path =。)将其传递给转换器并输出一些颜色。

编辑:

我知道看到我将UpdateSourceTrigger置于错误的绑定上。 将它放在上面的名称上,在你的cellstyle中也绑定到Name。

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=.} />        

您没有绑定财产。

在以下情况下评估Binding:

1)DependencyObject初始化并评估它的所有DP。它第一次获得它的价值。

2)UpdateSourceTrigger = LostFocus(DataGrid中的默认值)它在LostFocus上终止。这就是在行之间传递时评估Binding的原因。

3)UpdateSourceTrigger = PropertyChanged。如果您不想使用datacontext,则必须显式设置一个属性,该属性将返回自身并在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进行评估,但是你不会以任何方式对它进行评估,因为它会在第一次评估,然后对名称进行任何更改。