基于编辑状态在XAML DataGrid中设置行背景颜色

时间:2012-03-19 15:53:40

标签: c# wpf xaml wpf-controls wpfdatagrid

以下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事件处理程序只启用更新按钮。

这是相关的ViewModel:

    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);
    }

Gateway是使用ServiceStack OrmLite Sqlite对Sq​​lite的简单调用。

思想?

2 个答案:

答案 0 :(得分:1)

我会在视图模型上建议一个新属性,例如IsDirty,然后你可以使用DataTrigger来触发它,你当然必须使用右边自己更改属性DataGrid个事件或内部变更通知。

答案 1 :(得分:0)

如果我是你,我会看一下设置UpdateSourceTrigger to Explicit然后在你想要将更改提交给viewmodel时触发UpdateSource方法。这样,您可以指定何时实际编辑属性。

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

否则,如果这不好,那么H.B.说是现场,这就是你应该这样做的方式。