2012-03-19 17 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 :

조금 더 명확하게 - 단지 다른 뭔가를 찾고 - I가 위의 코드를 기대하는대로 동작합니다. 그것은 행을 편집 할 때만 뒤 색상을 변경합니다. 변경 사항을 저장하기 전에 해당 행을 탐색하면 배경색이 다시 기본값으로 돌아갑니다. 변경 사항이 저장 될 때까지 편집 백코 아웃을 편집 된 각 행에 유지하겠습니다. 저장하기 전에 데이터를 변경되지 않은 상태로 다시 변경하면 배경색을 기본값으로 다시 설정하고 싶습니다. 여기

코드의 더 :

<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는 사용하는 간단한 호출이다

이것은 relavent 뷰 모델이다.

생각하십니까?

답변

1

내가 IsDirty 같은 뷰 모델, 뭔가에 새 속성을 제안, 당신은 DataTrigger를 사용하여, 당신은 물론 올바른 DataGrid 이벤트 또는 내부 변경 알림을 사용하여 특성을 직접 변경해야 할 것이라는 점에 트리거 할 수 있습니다.

+0

감사합니다. 편집 된 ID 모음을 유지하면서이 작업을 수행했습니다. 편집/업데이트 된 행을 색칠하는 논리는 트리거에 비해 너무 복잡하므로 코드에서 수행해야합니다. – IUnknown

0

만약 내가 당신이라면, UpdateSourceTrigger to Explicit을 설정 한 다음,메서드를 실행하여 viewmodel에 변경 사항을 적용하려고 할 것입니다. 이렇게하면 속성의 편집이 실제로 발생하는 시점을 지정할 수 있습니다.

나는 이것으로 IsEditing이 어떻게 대응하는지 보았습니다. 전에 정말이 UpdateSourceTrigger 값을 사용한 적이 없으므로 전혀 모른다. 속성이 잘 업데이트되는 방식은 최소한 제어 할 수 있습니다.

그렇지 않으면 이것이 좋지 않다면 무엇이 H.B. 말했다, 그것은 당신이 그것을 해야하는 방법입니다.

관련 문제