C# WPF DataGrid在编辑后更新单元格样式
在XAML中,我在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
<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>