2009-07-29 3 views
0

ItemsSource 컬렉션의 항목 유형에 따라 wpf 데이터 격자의 열 스타일을 변경할 수 있는지 궁금합니다.ItemsSource의 데이터 유형에 따라 wpf 데이터 격자의 다른 셀 스타일링

wpf 툴킷의 wpf DataGrid가 있습니다. 그리드의 단일 행은 ItemsSource 컬렉션의 항목 유형에 따라 스타일을 지정해야합니다. 따라서 모든 항목은 동일한 기본 클래스 유형이지만 일부 파생 유형의 열은 다른 양식을 가져야합니다.

이것이 가능합니까?

감사합니다.

답변

2

네, 여러 가지 방법으로 수행 할 수 있습니다. 하나는 입력 유형에 따라 값을 선택하는 사용자 지정 "typeswitch"변환기를 작성하는 것입니다. 이처럼 : 다음

public class TypeSwitchConverter : Dictionary<Type, object>, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, .CultureInfo culture) 
    { 
     foreach (var mapping in this) 
     { 
      if (mapping.Key.IsAssignableFrom(value.GetType())) 
      { 
       return mapping.Value; 
      } 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

그리고 당신의 셀 템플릿의 최상위 요소의 Style 바인딩을 사용하고, 필요에 따라 바인딩을 위해 위의 컨버터를 사용합니다.

<ListBox ItemsSource="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"> 
        <TextBlock.Style> 
         <Binding> 
          <Binding.Converter> 
           <my:TypeSwitchConverter> 
            <Style x:Key="{x:Type cor:Int32}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Red" /> 
            </Style> 
            <Style x:Key="{x:Type cor:String}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Green" /> 
            </Style> 
            <Style x:Key="{x:Type sys:Uri}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Blue" /> 
            </Style> 
           </my:TypeSwitchConverter> 
          </Binding.Converter> 
         </Binding> 
        </TextBlock.Style> 
       </TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

빠른 답장을 보내 주셔서 감사합니다. 문제는 항목 컬렉션의 유형에 따라 스택 패널에 다른 컨트롤을 추가하려는 것입니다. 어떻게 해결할 수 있니? 그래서 의 경우 에 ItemsCollection의 유형에 따라 다른 컨트롤 객체를 추가해야합니다. –

+0

그런 다음 위의 'TypeSwitchConverter'를 사용하여 다른 템플릿에 'ItemTemplate' 속성을 바인딩하십시오. –

+0

사실, 죄송 합니다만, 약간의 수정 - 'ItemTemplate'을 설정할 때 현재 항목이 없으므로 직접 바인딩 할 수 없습니다. 따라서 어떤 유형의 단일 요소 (예 :'ContentPresenter')를 포함하는 'ItemTemplate'을 정의한 다음 스위치 변환기를 사용하여 해당 요소의 'Template'속성을 바인딩합니다. –

4

WPF 전용 솔루션 : 다음은 ListBox에서 스타일 항목을 사용하는 간단한 예입니다

내가 늦게 파티를하지만, 다른 사람이 이런 일을하려고하면 조금 오전, WPF만의 솔루션이 있습니다. 이 직접 적절한 DataTemplate을 찾습니다 더 DataGridColumn 클래스 없다 그러나 우리는 간접적으로이 같은 ContentPresenter에 사용할 수있는 다음 CellTemplate 내부 DataTemplate을 내부 ContentPresenter에를 사이에 의해

<Window.Resources> 
    <DataTemplate DataType="{x:Type models:Employee}"> 
     <Grid>...</Grid> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type models:Manager}"> 
     <Grid>...</Grid> 
    </DataTemplate> 
</Window.Resources> 

<DataGrid ... > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="MyColumn"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ContentPresenter Content="{Binding}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

을, 우리가 원하는 결과를 얻을 수 .

+0

훌륭한 솔루션이지만 하나 이상의 열로 확장 할 수 있습니까? 데이터 유형에만 의존하는 경우 다른 열 (예 : 제목 및 하위)에 대해 '올바른'데이터 템플릿을 선택하려면 어떻게해야합니까? – mechanic

관련 문제