2012-03-19 304 views
2

当行正在编辑下面的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> 

但我也想有下列行为:

  • 改回保存后
  • 如果编辑破灭,变回默认的颜色默认颜色

关于如何做到这一点的任何建议?

UPDATE:

一点更清晰 - 它的行为我希望上面的代码 - 只是在寻找不同的东西。它改变了背景颜色,但只在我编辑该行时。当我离开那一行(保存更改之前)时,背景颜色会恢复为默认值。我希望编辑背景保留在每个编辑的行上,直到保存更改。如果我在保存前将数据更改回原来的状态,我希望背景颜色重置为默认值。

下面是更多的代码:

<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事件处理程序只允许更新按钮。

这是relavent视图模型:

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。

想法?

回答

1

我建议在视图模型,就像IsDirty一些新的属性,然后就可以对使用DataTrigger,你当然得使用权DataGrid事件或内部更改通知自行更改属性。

+0

谢谢,我最终这样做 - 保留编辑ID的集合。为编辑/更新的行着色的逻辑对于触发器来说太复杂,因此需要在代码中完成。 – IUnknown 2012-03-20 15:32:43

0

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

我会玩这个看看IsEditing是如何对应它的。我从来没有真正使用过这个UpdateSourceTrigger值,所以我不知道。它至少可以控制房产更新的方式。

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