在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;。
答案 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进行评估,但是你不会以任何方式对它进行评估,因为它会在第一次评估,然后对名称进行任何更改。