2010-01-21 2 views
1

사용자가 편집을 수행했을 때 셀의 배경색이 변경됩니다. 변경 사항이 저장되거나 되돌릴 때 모든 셀을 표준 색상으로 되돌리고 싶습니다.WPF 용 Xceed DataGrid의 모든 셀을 순환 시키시겠습니까?

(부모 행에 저장된대로) 셀의 원래 배경색을 설정하기 만하면됩니다. 하지만 테이블의 모든 셀을 루프하여 다시 설정하는 방법을 알 수는 없습니다.

Xceed Knowledge Base에서 "How to iterate through the grid's rows"이라는 기사를 발견했습니다 ... 완벽하다고 생각하십니까? 잘못된; 이 기사에서 언급 된 .DataRows, .FixedHeaderRows 등과 같은 속성 (또는 방법)은 an older/defunct Xceed product입니다.

This forum thread

내 경우 System.Data.DataRowView의 컬렉션을 반환하는 데이터 그리드의 .Items 속성을 사용하는 것이 좋습니다 ...하지만 나는 Xceed.Wpf.DataGrid.DataCell s의 모든 것을 캐스팅 방법 (또는 그와 관련된 요소 중 하나를) 찾을 수 없습니다 배경색을 변경해야합니다.

요약하면 백그라운드 속성을 다시 설정할 수 있도록 행과 셀을 반복하는 방법은 무엇입니까?

답변

3

Mohamed, an Xceed employee who posted on the Xceed Forums 덕분에 문제가 해결되었습니다.

foreach (object item in this.DataGrid1.Items) 
{ 
    Dispatcher.BeginInvoke(new Action<object>(RemoveRowHighlights), DispatcherPriority.ApplicationIdle, item); 
} 
... 
private void RemoveRowHighlights(object item) 
{ 
    Xceed.Wpf.DataGrid.DataRow row = this.DataGrid1.GetContainerFromItem(item) as Xceed.Wpf.DataGrid.DataRow; 
    if (row != null) foreach (Xceed.Wpf.DataGrid.DataCell c in row.Cells) 
    { 
     if (c != null) c.Background = row.Background; 
    } 
} 
1

데이터 바인딩을 대신 사용하도록 비즈니스 로직을 변경하는 것이 좋습니다.

데이터 그리드의 각 셀은 개체가 될 것이며 편집 된 개체인지는 알 수 있습니다. 그런 다음 데이터를 해당 속성에 바인딩 할 수 있으므로 모든 개체를 저장하고 다시 설정하면 상태가 GUI에서 업데이트됩니다.

또한 무료로 우려 사항을 표시합니다. GUI는 이제 어떻게 저장해야하는지/저장하지 않을 것인지에 대한 비즈니스 논리가 있어야하는 것이 아니라, 어떻게보아야하는지 결정합니다.

+0

내 DataGrid는 이미 데이터 바인딩을 사용하고 있습니다. 그렇습니다. 비즈니스 논리와 프레젠테이션은 이미 분리되어 있습니다.이 질문은 프레젠테이션 부분에 관한 것입니다. 셀의 IsDirty 속성이 true 일 때 이미 별도의 스타일 (본질적으로 "강조 표시됨")을 만들려고했지만 그다지 효과가 없다는 점에 대해서는 언급하지 않았습니다. 내가 말할 수있는 한 Xceed의 WPF 용 DataGrid는 일부 속성 (예 : IsMouseOver)에 대해서만 스타일 트리거를 설정할 수 있도록 허용하지만 다른 항목 (예 : IsDirty와 같은 데이터 관련 항목 포함)에는 스타일 트리거를 설정할 수 없습니다. – ewall

0

이 작업을 수행하기 위해 권장되는 방법은 (때문에 UI 가상화의) 암시 적 스타일의 트리거를 통해, 그리고 Xceed DataGrid의 모든 속성은 데이터 그리드에 정의 된 테마에 의해 부과 제외하고, 설정할 수 있습니다 : 예제 코드는 다음과 같다.

:

<Style TargetType="{x:Type xcdg:DataCell }"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsDirty}" 
        Value="True"> 
      <Setter Property="Background" 
        Value="DeepSkyBlue" /> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style>