2012-06-10 6 views
2

XAML을 사용하여 홀수 행에 다른 색을 설정하려고합니다.행에 홀수가 있는지 확인하는 방법은 무엇입니까?

문제의 DataGrid에는 다르게 색상을 지정하려는 3 가지 유형의 데이터가 있으며 단순히 AlternatingRowBackground를 변경하면 변경되지 않습니다.

내가

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Type}" Value="0"/>       
     <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/> 
     <Condition Binding="{Binding IsOddRow, RelativeSource={RelativeSource Self}}" Value="False"/> 
    </MultiDataTrigger.Conditions>  
    <Setter Property="Background" Value="#FFDFE6ED"/>     
</MultiDataTrigger> 

같은 것을 사용에 대한 계획입니다 IsOddRow과 같은 속성이있을 것 같지 않습니다. 대신 어떤 속성을 확인해야합니까?

답변

2

사용중인 그리드/행 유형이 확실하지 않아 정확한 속성 이름을 줄 수는 없지만 행의 인덱스 (행 번호)에 바인딩하고 value converter (true를 반환)을 사용하십시오. 행이 홀수인지 또는 짝수인지 확인하십시오.

3

DataGridAlternationCount을 설정하고 조상 DataGridRows 첨부 된 속성 ItemsControl.AlternationIndex에 바인딩 할 수 있습니다. 값이 "1"이면 홀수 행 번호를가집니다. 연결된 속성에 바인딩 할 때, 당신은 연결된 속성 괄호를 넣어해야

<DataGrid ItemsSource="{Binding ...}" 
      AlternationCount="2"> 
    <DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Type}" Value="0"/> 
         <Condition Binding="{Binding RelativeSource={RelativeSource Self}, 
                Path=IsSelected}" 
            Value="False"/> 
         <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
                Path=(ItemsControl.AlternationIndex)}" 
            Value="1"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Background" Value="#FFDFE6ED"/> 
       </MultiDataTrigger> 
       <!-- ... --> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.CellStyle> 
    <!-- ... --> 
</DataGrid> 

참고. Path=(ItemsControl.AlternationIndex)은 작동하지만 Path=ItemsControl.AlternationIndex은 작동하지 않습니다.


업데이트
또한 첨부 된 행동을 통해 재산 IsOddRow를 만들 수 있습니다. 당신이 LoadingRow을 구독하는 행동. 이벤트 처리기에서로드 된 행의 인덱스를 가져오고 홀수인지 여부를 확인합니다. 그 결과는 바인딩 할 수있는 IsOddRow이라는 첨부 된 속성에 저장됩니다.

이 동작은 DataGrid

<DataGrid ItemsSource="{Binding ...}" 
      behaviors:DataGridBehavior.ObserveOddRow="True"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Type}" Value="0"/> 
         <Condition Binding="{Binding Path=IsSelected, 
                RelativeSource={RelativeSource Self}}" Value="False"/> 
         <Condition Binding="{Binding Path=(behaviors:DataGridBehavior.IsOddRow), 
                RelativeSource={RelativeSource Self}}" Value="False"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Background" Value="#FFDFE6ED"/> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

DataGridBehavior

public class DataGridBehavior 
{ 
    #region ObserveOddRow 

    public static readonly DependencyProperty ObserveOddRowProperty = 
     DependencyProperty.RegisterAttached("ObserveOddRow", 
              typeof(bool), 
              typeof(DataGridBehavior), 
              new UIPropertyMetadata(false, OnObserveOddRowChanged)); 
    [AttachedPropertyBrowsableForType(typeof(DataGrid))] 
    public static bool GetObserveOddRow(DataGrid dataGrid) 
    { 
     return (bool)dataGrid.GetValue(ObserveOddRowProperty); 
    } 
    public static void SetObserveOddRow(DataGrid dataGrid, bool value) 
    { 
     dataGrid.SetValue(ObserveOddRowProperty, value); 
    } 

    private static void OnObserveOddRowChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     DataGrid dataGrid = target as DataGrid; 
     dataGrid.LoadingRow += (object sender, DataGridRowEventArgs e2) => 
     { 
      DataGridRow dataGridRow = e2.Row; 
      bool isOddRow = dataGridRow.GetIndex() % 2 != 0; 
      SetIsOddRow(dataGridRow, isOddRow); 
     }; 
    } 

    #endregion // ObserveOddRow 

    #region IsOddRow 

    public static DependencyProperty IsOddRowProperty = 
     DependencyProperty.RegisterAttached("IsOddRow", 
              typeof(bool), 
              typeof(DataGridBehavior), 
              new PropertyMetadata(false)); 
    [AttachedPropertyBrowsableForType(typeof(DataGridRow))] 
    public static bool GetIsOddRow(DataGridRow dataGridCell) 
    { 
     return (bool)dataGridCell.GetValue(IsOddRowProperty); 
    } 
    public static void SetIsOddRow(DataGridRow dataGridCell, bool value) 
    { 
     dataGridCell.SetValue(IsOddRowProperty, value); 
    } 

    #endregion // IsOddRow 
} 
+0

컨트롤이 표준 DataGrid 인 경우이 방법은 내 값보다 더 나은 방법입니다 (값 변환기가 필요하지 않음). –

0

거의 모든 응답 사용 AlternationCount="2"behaviors:DataGridBehavior.ObserveOddRow="True"를 추가 시작하려면하지만 난 그것을 너무 제한 조금 찾을 수 있습니다. 내 편이면 AlternationCount="{ Binding MainData.ProjColl.Count}"과 같은 것을 사용하여 끝까지 내 행의 번호를 매 깁니다 (0에서 시작하도록주의하십시오!).

이 경우 @Danny Varod에서 언급 한 값 변환기가 필요합니다.

나는

public class IsEvenConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     bool res = false; 
     int? val = value as int?; 
     if (null != val) 
      res = (0 == (val % 2)); 
     return res; 
    }  
    ... 
} 

(거의 질문에 대답) 행의 색상을 대체하기 위해 컨버터를 사용하여 호출 XAML

<UserControl ... 
<UserControl.Resources> 
    ... 
    <vm_nmspc:IsEvenConverter x:Key="IsEven"/> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="Width" Value="Auto"/> 
     <Setter Property="Background" Value="LightGray"/> 

     <!--Converter will be used below--> 

     <Style.Triggers> 
      ... 
      <Setter Property="Background" Value="LightGray"/ 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
              Path=(ItemsControl.AlternationIndex), 
              Converter={StaticResource ResourceKey=IsEven}}" Value="true"> 
       <Setter Property="Background" Value="Lavender"/> 
      </DataTrigger> 
      <Trigger Property="IsMouseOver" Value="True" > 
       <Setter Property="Background" Value="LightGreen"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

<Grid> 
    <DataGrid ItemsSource="{Binding MainData.ProjColl}" AutoGenerateColumns="False" 
    AlternationCount="{ Binding MainData.ProjColl.Count}" > 
    ... 
    <DataGridTextColumn Header="Project Name" .... 

    </DataGrid> 
</Grid> 
</UserControl> 

일부 개별 스크린 샷

enter image description here enter image description here

동일한 코드의 다른 부분 : Simple way to display row numbers on WPF DataGrid

관련 문제