2010-08-08 3 views
1

CellData라는 매우 간단한 개체가 있습니다. 다음과 같이 정의됩니다 :itemsource에서 개체의 속성을 기반으로 WPF DataGrid에서 Cell의 색을 변경하는 방법은 무엇입니까?

public sealed class CellData 
{ 
    internal string DisplayText 
    { 
     get; 
     set; 
    } 

    public string Color 
    { 
     get; 
     set; 
    } 

    public override string ToString() 
    { 
     return this.DisplayText; 
    } 
} 

저는 WPF 툴킷 DataGrid를 사용하여 표시 할 수 있습니다. 그러나 셀에있는 데이터를 기반으로 각 셀의 배경색을 변경할 수 있어야합니다. DataTrigger의 CellData 객체를 볼 수 없기 때문에 어떤 유형의 바인딩이 필요한지 이해하는 데 어려움을 겪고 있습니다. 나는 다음과 같은, 그리고 여러 가지 다른 변화를 시도했지만 난 일하러 수 없습니다

  <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(CellData).Color, Mode=OneWay}" Value="1"> 
       <Setter Property="Background" Value="Red" /> 
       <Setter Property="Foreground" Value="White" /> 
      </DataTrigger> 

내가 XAML 그래서 어떤 제안을 크게 감상 할 수 databidinding에 아주 새로운 오전. 고맙습니다.

답변

1

여러 CellData 개체를 포함하는 RowData 개체가 있고 DataGrid의 ItemsSource를 RowData 개체의 목록에 바인딩했으며 RowData의 속성에 바인딩 된 DataGridTextColumns 또는 다른 DataGridBoundColumns를 사용하고 있다고 생각합니다. , 아마도 AutoGenerateColumns = "True"를 사용하면됩니다.

문제는 셀의 DataContext가 실제로 CellData가 아닌 RowData라는 점입니다. 바인딩은 TextBlock 및 TextBox의 Text 속성에만 사용됩니다. 이 기능은 RowData 객체의 다른 속성을 기반으로 트리거를 만들려는 경우 유용하지만 셀 데이터에 대한 풍부한 데이터 구조가있는 것과 같은 시나리오에서는 어려워집니다. 명시 적으로 열을 작성하는 경우

, 당신은 단지 트리거에 다시 열의 속성을 사용할 수 있습니다 :

불행하게도
<DataGridTextColumn Binding="{Binding Foo}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Style.Triggers> 
       <!-- DataContext is the row, so start 
        binding path with Foo property --> 
       <DataTrigger Binding="{Binding Foo.Color}" Value="1"> 
        <Setter Property="Background" Value="Red" /> 
        <Setter Property="Foreground" Value="White" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

이이 특정이기 때문에 당신이 열 사이의 스타일을 공유 할 수 없습니다 열 이름에. 이렇게하려면 GenerateElement 및 GenerateEditingElement에 의해 반환 된 개체의 DataContext 속성에 적용되는 Binding 유형의 속성이있는 사용자 지정 DataGridColumn 하위 클래스를 만들어야 할 수 있습니다. (A 당신이 당신의 샘플에서와 마찬가지로 자기의 RelativeSource와 바인딩 당신이 CellData 개체를 얻을 도움이되지 않습니다 오히려 그것의 DataContext보다 시각적 트리, 당신에게 요소를 제공합니다 사용.)

+0

마우리 Reginelli - 따라갈 지 모르겠습니다. Quartermeister, 내가하는 일은 DataTable을 만든 다음 DataTree의 DataContext를 DataTable에 설정하고 AutoGenerate를 true로 설정하는 것입니다. 문제는 열과 행이 모두 런타임에 생성된다는 것입니다. 그 중에서도 열에있는 모든 셀의 색을 변경하고 싶지 않기 때문에 열에 스타일을 적용하고 싶지는 않습니다. 여기서 문제는 바인딩과 XAML이 어떻게 작동하는지 완전히 이해하지 못한다는 것입니다. 나는 연구를 계속할 것이지만 만약 당신이 위대한 것이라고 다른 제안이 있다면. – Nick

+0

@Nick : 열에 CellStyle을 적용하면 각 셀에 개별적으로 트리거가 적용되므로 사용자가 원하는 것일 수 있습니다. 셀의 DataContext가 개별 셀의 값이 아닌 DataRow가되기 때문에 AutoGenerated 열을 사용하면 어려울 것입니다. TextBlock 또는 TextBox의 Text 속성 만 특정 열에 바인딩됩니다. AutoGeneratingColumn 이벤트를 처리하고 현재 열을 기반으로하는 스타일을 적용하여 수행 할 수 있지만 코드에서 많은 프리젠 테이션 계층 논리를 수행 할 수 있습니다. – Quartermeister

+0

Quartermeister - 나는 다시 돌아가 수동으로 열을 정의한 다음 위의 팁을 사용했습니다. 모든 것이 잘되었습니다. 고마워요! 그것은 기괴하며 WPF에 익숙하지 않기 때문에 아마도 WPF DataGrid가 뒤로 물러나는 것처럼 느껴집니다. – Nick

0

ValueConverter를 사용할 수 있습니다. 셀의 배경색과 개체의 Color 속성 사이에 바인딩을 만든 다음 ValueConverter를 추가하여 데이터가 배경을 설정하는 데 필요한 개체로 제대로 변환되도록합니다.

관련 문제