根据编辑状态设置XAML DataGrid中的行背景颜色
本文关键字:背景 颜色 DataGrid XAML 编辑 状态 设置 | 更新日期: 2023-09-27 18:28:20
以下XAML在编辑行时可以很好地更改背景色:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" >
<Setter Property="Background" Value="AntiqueWhite" />
<Style.Triggers>
<Trigger Property="IsEditing" Value="true">
<Setter Property="Background" Value="red" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
但我也喜欢以下行为:
- 保存后更改回默认颜色
- 如果编辑已撤消,请更改回默认颜色
有什么建议吗?
更新:
稍微清晰一点——它的行为正如我所期望的上面的代码一样——只是在寻找不同的东西。它会更改背面颜色,但仅当我编辑行时才会更改。当我离开该行时(在保存更改之前),背景颜色将恢复为默认颜色。我希望编辑背景颜色保留在每个编辑行上,直到保存更改为止。如果我在保存之前将数据更改回未更改的状态,我希望背景颜色重置回默认值。
以下是更多代码:
<DataGrid EnableRowVirtualization="True" ItemsSource="{Binding CurrentTransactionList}" AutoGenerateColumns="false" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="5" Name="TransactionTable" VerticalAlignment="Stretch" RowEditEnding="TransactionTable_RowEditEnding">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" >
<Setter Property="Background" Value="AntiqueWhite" />
<Style.Triggers>
<Trigger Property="IsEditing" Value="true">
<Setter Property="Background" Value="red" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Width="40" Binding="{Binding Id}" IsReadOnly="True" Foreground="Gray" />
<DataGridTextColumn Header="Label" Width="250" Binding="{Binding Label}" />
<DataGridComboBoxColumn Header="Stat" SelectedItemBinding="{Binding Stat}" ItemsSource="{Binding Source={StaticResource stats}}" Width="125" />
<DataGridTextColumn Header="Change" Binding="{Binding Change}" Width="75" />
</DataGrid.Columns>
TransactionTable_RowEditEnding事件处理程序仅启用更新按钮。
这是相关视图模型:
private ObservableCollection<StatTransactionValue> currentTransactionList;
public ObservableCollection<StatTransactionValue> CurrentTransactionList {
get { return currentTransactionList; }
set {
if (value != currentTransactionList) {
currentTransactionList = value;
NotifyPropertyChanged("CurrentTransactionList");
}
}
}
public void SetCurrentTransactionList(long ItemId) {
CurrentTransactionList = Gateway.GetTransactions(ItemId);
}
public void UpdateTransactions() {
Gateway.UpdateTransactions(CurrentTransactionList);
}
网关是使用ServiceStack OrmLite Sqlite对Sqlite的简单调用。
想法?
我建议在视图模型上创建一个新的属性,比如IsDirty
,然后您可以使用DataTrigger
触发它,当然您必须使用正确的DataGrid
事件或内部更改通知自己更改属性。
如果我是你,我会考虑将UpdateSourceTrigger设置为Explicit,然后在你想将更改提交到视图模型时激发UpdateSource方法。通过这种方式,您可以指定实际编辑属性的时间。
我会玩这个,看看IsEditing是如何对应的。我以前从未真正使用过这个UpdateSourceTrigger值,所以我不知道。它至少可以很好地控制属性更新的方式。
否则,如果这不好,那么H.B.所说的是正确的,那就是你应该做的。