2012-11-20 2 views
0

DataGridCell의 내용을 변경하고 싶습니다.datagrigger의 DataGridcell에서 내용을 변경하십시오.

<Style TargetType="DataGridCell" x:Key="ChangeContentOfCellSstyle"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsWashed}" Value="True"> 
      <Setter Property="Content" Value="The new value for the cell."/> 
      <Setter Property="Background" Value="Red"/> //sets the background of the cell to red just to show the trigger is working 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

그러나 셀의 내용이 변경되지 않은 : 나는 그런 내가 DataTrigger과 같이이 너무

<DataGridCheckBoxColumn CellStyle="ChangeContentOfCellSstyle"... 

처럼 DataGridView에있는 열을 가지고있다. 심지어 셀이 빨간색으로 바뀌어도 DataGridTextColumn을 사용하여 동일한 작업을 시도해 볼 필요가 없습니다.

답변

1

템플릿 선택기를 사용하면 훨씬 더 좋은 방법이므로 이전 답변을 삭제했습니다.

먼저 바인딩을 기반으로 DataTemplates를 전환하는 데 사용할 수있는 DataTemplateSelector 클래스를 만들고 적용 할 스타일에 대한 참조를 가져 오는 2 개의 속성을 기록해 두었습니다. 뷰 디자이너가 하드 코딩 된 템플릿 키를 사용하지 않아도됩니다.

public class IsWashedStyleSelector : DataTemplateSelector 
{ 

    public DataTemplate TrueStyle { get; set; } 
    public DataTemplate FalseStyle { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     TestClass targetItem = item as TestClass; 
     if (targetItem != null) 
     { 
      return targetItem.IsWashed ? TrueStyle : FalseStyle; 
     } 
     return base.SelectTemplate(item, container); 
    } 
} 

이제이 템플릿 선택기를 사용하려면 xaml 리소스에 2 개의 데이터 템플릿을 정의하고 인스턴스를 추가해야합니다.

<DataTemplate x:Key="styleIsWashedTrue"> 
    <Button>It's true</Button> 
</DataTemplate> 
<DataTemplate x:Key="styleIsWashedFalse"> 
    <Label>is false</Label> 
</DataTemplate> 

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector" TrueStyle="{StaticResource styleIsWashedTrue}" FalseStyle="{StaticResource styleIsWashedFalse}"/> 

마지막 셀렉터 그래서 같은 DataGridTemplateColumn에 사용될 수있다.

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Binding="{Binding IsWashed}"/> 
      <DataGridTextColumn Binding="{Binding Text}"/> 
      <DataGridTemplateColumn CellTemplateSelector="{StaticResource isWashedStyleSelector}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

감사합니다. Andy, 멋지 네요. 나는 지금 그것을 들여다 볼 것이다. –

0

이 답변은 정말로 @ 앤디의 대답에 대한 의견입니다. 내가 코멘트에 코드를 포맷 할 수없는 것 같습니다.

XAML의 DataTemplate 정의를 인라인하여 모든 것을 한 곳에서 모두 처리 할 수 ​​있습니다. 물론

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector"> 
    <local:IsWashedStyleSelector.TrueStyle> 
    <DataTemplate> 
     <Button>It's true</Button> 
    </DataTemplate> 
    </local:IsWashedStyleSelector.TrueStyle> 
    <local:IsWashedStyleSelector.FalseStyle> 
    <DataTemplate> 
     <Label>is false</Label> 
    </DataTemplate> 
    </local:IsWashedStyleSelector.FalseStyle> 
</local:IsWashedStyleSelector> 

, 이것은 당신은 단지 한 곳에서 그 DataTemplate 정의를 사용하고자 할 때입니다.

관련 문제