根据编辑状态设置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的简单调用。

想法?

根据编辑状态设置XAML DataGrid中的行背景颜色

我建议在视图模型上创建一个新的属性,比如IsDirty,然后您可以使用DataTrigger触发它,当然您必须使用正确的DataGrid事件或内部更改通知自己更改属性。

如果我是你,我会考虑将UpdateSourceTrigger设置为Explicit,然后在你想将更改提交到视图模型时激发UpdateSource方法。通过这种方式,您可以指定实际编辑属性的时间。

我会玩这个,看看IsEditing是如何对应的。我以前从未真正使用过这个UpdateSourceTrigger值,所以我不知道。它至少可以很好地控制属性更新的方式。

否则,如果这不好,那么H.B.所说的是正确的,那就是你应该做的。