Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid在编辑后更新单元格样式_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

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

C# WPF DataGrid在编辑后更新单元格样式,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,在XAML中,我在DataGrid中有一列,定义如下: <DataGridTextColumn Header="Name" Binding="{Binding Name}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" > <Setter Proper

在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>
调用刷新有帮助,但触发刷新的正确事件是什么?我在CellEditEnding中尝试了它,但出现了一个异常“AddNew或EditItem事务中不允许刷新”。

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

2) 我猜您没有CellEditTemplate

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

编辑:

我知道你看到我把UpdateSourceTrigger放在了错误的绑定上。 将其放在上面的名称上,并在您的cellstyle中绑定到名称

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> 
XAML:

     <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" >
          <Setter Property="Background" Value="{Binding Self,Converter={StaticResource NameToBrushConverter}}"/>
      </Style>


但这不会在LostFocus上进行计算,但您不需要以任何方式进行计算,因为它将在第一次计算时,然后在对名称进行任何更改时进行计算

你的例子是有效的,但我还有一个问题。我改变了转换器的方式,我得到的对象作为参数。所以我只写,而不是添加路径、名称和名字。所以我得到了整个物体。只要我用任何属性添加第二个绑定路径(例如,字段被更新。但是当我只传递对象时(仅当移除包含路径的所有其他绑定时,PropertyChangeEvent不会触发样式更新。是否有任何方法可以在不传递2个字符串的情况下,而通过传递Person对象来实现这一点?传递对象本身是什么意思?正如我在上文中针对对象本身的绑定(即绑定)所述)它只在第一次和每个LostFocus上发生。您看到您没有要绑定的属性,您在该属性上引发了属性更改事件。我猜您可以公开一个属性,比如Self{get return this;}并为其引发属性更改事件。但当名字更改时,您必须在类中执行此操作,这将比我的解决方案更难读取。最后一件事就是我要找的。谢谢。因为您需要转换器中的实体?我只是认为它更难读取。您无法确定绑定的时间通过查看xaml来评估。
  <SomeElement Tag={Binding} />
  Or 
  <SomeElement Tag={Binding Path=.} />        
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 { };
}
     <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" >
          <Setter Property="Background" Value="{Binding Self,Converter={StaticResource NameToBrushConverter}}"/>
      </Style>