gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:48 26 4
gpt4 key购买 nike

在 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>

Name 列和 FirstName 列具有相同的内容时,NameToBrushConverter 返回一种颜色。否则返回 DependencyProperty.UnsetValue

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

为对象实现 INotifyPropertyChanged 没有帮助。

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

dataGrid.Items.Refresh();

调用刷新有帮助,但触发刷新的正确事件是什么?我在 CellEditEnding 中尝试过,但出现异常 Refresh is not allowed in AddNew- or EditItem transactions.

最佳答案

  1. 你需要设置UpdateSourceTriggerPropertyChanged因为它默认设置为 LostFocusDataGrid 内.

  2. 我猜你没有 CellEditTemplate .

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

编辑:

我知道我把 UpdateSourceTrigger在错误的绑定(bind)上。将它放在上面的名称上,并在您的单元格样式中也绑定(bind)到 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 中的每个绑定(bind)的默认 UpdateSourceTrigger ,即 LostFocus .

当绑定(bind)到当前DataContext使用:

<SomeElement Tag={Binding}/>

或者:

<SomeElement Tag={Binding Path=.}/>

您没有绑定(bind)到属性。在以下情况下评估绑定(bind):

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

  2. UpdateSourceTrigger=LostFocus (DataGrid 中的默认值)它最终发生在 LostFocus 上.这就是为什么在行之间传递时会评估 Binding 的原因。

  3. UpdateSourceTrigger=PropertyChanged .如果你想要它在你的 DataContext 上您必须显式设置一个属性,该属性将返回自身并在名称属性更改时调用它。

像这样:

C#:

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 上进行评估,但您在任何方面都不需要它,因为它会第一次评估,然后对名称的任何更改进行评估。

关于c# - WPF DataGrid 在编辑后更新单元格样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com