2010-12-22 1 views
0

WPF DataGrid가 있는데 DataView의 데이터로 채 웁니다. 조건부로 Predicate 함수의 결과를 기반으로 DataGrid의 각 셀에 스타일을 적용하려고합니다.원본 개체의 Predicate 결과에 따라 스타일을 조건부로 바인딩 할 수 있습니까?

아직 WPF 데이터 바인딩을 얻지 못하므로 어떻게 시작해야하는지, 어디에서 시작해야하는지에 관해서는 분실했습니다. 누구든지 포인터 나 솔루션을 제공 할 수 있습니까?

답변

0

이러한 바인딩을 수행하는 표준 ("XAML 전용"과 같은) 방법은 없습니다. 바인딩 자체는 시각적 요소와 소스의 속성 값 (인스턴스 또는 정적) 간의 1 : 1 관계를 지정할 수있게합니다. 속성은 속성을 통해 자동으로 표현되지 않으므로 바인딩 할 수 없습니다.

그러나 원본을 가져 와서 특성의 존재 여부를 확인하고 관심있는 스타일 이름을 반환하는 사용자 지정 변환기를 작성할 수 있습니다. 이 속성을 멋지게 만들려면 속성에 실제 스타일 이름을 사용할 수 있습니다. 비즈니스 모델이 뷰 논리에 대한 특정 지식을 갖기 때문에 프레젠테이션에 준 강하게 묶여 있음을 의미합니다.

MSDN (http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion)의 데이터 바인딩 개요에서 사용자 지정 변환기의 예를 볼 수 있습니다. 특정 경우에는 Convert 메서드의 값으로 실제 인스턴스를 지정할 수 있도록 원본 개체 자체에 바인딩을 만들어야합니다 (Path를 지정하지 않음). 이렇게하면 Type을 가져 와서 속성을 확인한 다음 바인딩을 위해 반환 할 Style 객체를 만들 수 있습니다.

업데이트 : 특정 셀의 스타일을 지정하려면 AutoGenerateColumns를 해제하고 특정 셀에 대해 DataGridTempletaColumn을 지정해야합니다. 그런 다음 자신 만의 데이터 템플릿을 지정합니다.이 데이터 템플릿은 객체에 바인딩 된 데이터이며 스타일 선택기를 사용합니다.

+0

하지만 내가 할 수있는 '데이터 격자의

<DataTemplate x:Key="SomeCellStyle" DataType="{x:Type local:MyItemViewModel}"> <TextBlock Text="{Binding Whatever}" /> </DataTemplate> <DataTemplate x:Key="OtherCellStyle" DataType="{x:Type local:MyItemViewModel}"> <TextBlock Text="{Binding Whatever}" /> </DataTemplate> 

'DataGrid.ItemContainerStyleSelector'가 행이 아닌 개별 셀에 적용되도록하는 방법을 알아 냈습니다. – thecoop

0

CellTemplateSelector이있는 DataGridTemplateColumn을 사용하여 뷰 모델의 임의의 속성을 기반으로 셀의 데이터 템플릿을 선택할 수 있습니다. 자원의

:

 <DataGridTemplateColumn Header="Name"> 
      <DataGridTemplateColumn.CellTemplateSelector> 
       <local:MyItemDataTemplateSelector TypeProperty="Type" 
        DefaultTemplate="{StaticResource SomeCellStyle}" 
        SomeTemplate="{StaticResource SomeCellStyle}" 
        OtherTemplate="{StaticResource OtherCellStyle}" /> 
      </DataGridTemplateColumn.CellTemplateSelector> 
     </DataGridTemplateColumn> 

코드 : 나는 StyleSelector``주변에 놀이를 했어

public class MyItemViewModel 
{ 
    public MyEnum Type { get; set; } 
} 

public class MyItemDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DefaultTemplate { get; set; } 
    public DataTemplate SomeTemplate { get; set; } 
    public DataTemplate OtherTemplate { get; set; } 
    public string TypeProperty { get; set; } 

    public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
    { 
     if (item != null) 
     { 
      var type = item.GetType(); 
      var property = type.GetProperty(TypeProperty); 
      if (property != null) 
      { 
       var value = property.GetValue(item, null); 
       if (value != null) 
       { 
        switch ((MyEnum) value) 
        { 
         case MyEnum.SomeValue: return SomeTemplate; 
         case MyEnum.OtherValue: return OtherTemplate; 
        } 
       } 
      } 
     } 
     return DefaultTemplate; 
    } 
} 
관련 문제