2012-03-19 281 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.說是現貨,這是你應該這樣做的方式。