1

データグリッドがあり、レコードのステータスに応じて行の色が異なります (有効は白、問題は金、禁止は赤)。

問題は、行が選択されると、すべてが均一な色になり、ステータスを判断できなくなることです。これと同様の方法でハイライトの色をバインドしたいと思います。

            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Setter Property="Background" Value="{Binding Member, Converter={StaticResource MemberBackgroundConverter}}" />
                    <Setter Property="HighlightBrushKey" Value="{Binding Member, Converter={StaticResource MemberHighlightConverter}}" />                        
                </Style>
            </DataGrid.RowStyle>

上記の最初のセッターは動作します。2番目のものを機能させる方法はありますか?行ごとに HighlightBrush を設定する方法はありますか?

編集:以下は、私が現在取り組んでいるものです。これが最善の方法であると示唆するつもりはありません。単にこの方法でうまくいくということです。

XAML:

<DataGrid.Resources>
    <SolidColorBrush x:Key="SelectionBackgroundColorKey" />

    <LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" StartPoint="0,0" EndPoint="0,1">
        <GradientStop Color="{Binding Source={StaticResource SelectionBackgroundColorKey}, Path=Color}" Offset="0.0" />
        <GradientStop Color="White" Offset="0.3" />
        <GradientStop Color="{Binding Source={StaticResource SelectionBackgroundColorKey}, Path=Color}" Offset="1.0" />
    </LinearGradientBrush>

    <SolidColorBrush x:Key="SelectionTextColorKey" Color="Black" />
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="{Binding Source={StaticResource SelectionTextColorKey}, Path=Color}" />
</DataGrid.Resources>

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Background" Value="{Binding BindsDirectlyToSource=True, Converter={StaticResource ReservationBackgroundConverter}}" />
        <Setter Property="Foreground" Value="{Binding IsNew, Converter={StaticResource IsNewForegroundConverter}}" />
    </Style>
</DataGrid.RowStyle>

コード:

    private void DataGridReservationsSelectionChanged(object argSender, SelectionChangedEventArgs argEvtArgs)
    {
        Reservation LocalReservation;

        ((SolidColorBrush) dataGridReservations.Resources["SelectionBackgroundColorKey"]).Color = Colors.SlateGray;
        ((SolidColorBrush) dataGridReservations.Resources["SelectionTextColorKey"]).Color = Colors.Black;

        LocalReservation = dataGridReservations.SelectedItem as Reservation;

        if (LocalReservation == null)
        {
            return;
        }

        if(LocalReservation.IsArrived)
        {
            ((SolidColorBrush)dataGridReservations.Resources["SelectionBackgroundColorKey"]).Color = Colors.ForestGreen;
            ((SolidColorBrush)dataGridReservations.Resources["SelectionTextColorKey"]).Color = Colors.Black;
            return;
        }
        //Is this Reservation a Problem?
        if (LocalReservation.Member.IsProblem)
        {
            ((SolidColorBrush) dataGridReservations.Resources["SelectionBackgroundColorKey"]).Color = Colors.Goldenrod;
            ((SolidColorBrush) dataGridReservations.Resources["SelectionTextColorKey"]).Color = Colors.Black;
            return;
        }

        //Is this Reservation Banned?
        if (LocalReservation.Member.IsBanned)
        {
            ((SolidColorBrush) dataGridReservations.Resources["SelectionBackgroundColorKey"]).Color = Colors.Firebrick;
            ((SolidColorBrush) dataGridReservations.Resources["SelectionTextColorKey"]).Color = Colors.Black;
            return;
        }
    }

このアプローチにより、選択されていない行をそれぞれの独立した行に設定し、選択した色をそれぞれの独立した行に設定することができます。

4

1 に答える 1

0

DataGridTextColumn を使用する場合は、ElementStyle を指定できます。

<DataGrid.Resources>
    <Style x:Key="MemberCellStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Background" Value="{Binding Member, Converter={StaticResource MemberBackgroundConverter}}" />
    </Style>
</DataGrid.Resources>

...

 <DataGridTextColumn ... ElementStyle="{StaticResource MemberCellStyle}">

背景色は、行が選択されているかどうかに関係なく、バインドに従います。

アップデート:

MultiDataTrigger を利用して、2 つの条件 (ステータス用に 1 つ、行が選択されているかどうか用に 1 つ) を作成できます。コードでスタイルを作成する例を次に示します (選択された条件と選択されていない条件の両方) が、必要に応じて XAML に変換するのは簡単です。

Style cellStyle = new Style( typeof( DataGridCell ) );
MultiDataTrigger triggerNotSelected = new MultiDataTrigger();
Condition dataCondition = new Condition( new Binding( "[STATUS]", [STATUSVALUE] );
Condition rowNotSelectedCondition = new Condition();
rowNotSelectedCondition.Binding = new Binding
     {
          Path = new PropertyPath( DataGridRow.IsSelectedProperty ),
          RelativeSource = new RelativeSource( RelativeSourceMode.FindAncestor, typeof( DataGridRow ), 1 )
     };
rowNotSelectedCondition.Value = false;

triggerNotSelected.Conditions.Add( dataCondition );
triggerNotSelected.Conditions.Add( rowNotSelectedCondition );
triggerNotSelected.Setters.Add( new Setter( Control.BackgroundProperty, Brushes.Gold ) );

MultiDataTrigger triggerSelected = new MultiDataTrigger();
Condition rowSelectedCondition = new Condition();
rowSelectedCondition.Binding = new Binding
    {
         Path = new PropertyPath( DataGridRow.IsSelectedProperty ),
         RelativeSource = new RelativeSource( RelativeSourceMode.FindAncestor, typeof( DataGridRow ), 1 )
    };
rowSelectedCondition.Value = true;

triggerSelected.Conditions.Add( dataCondition );
triggerSelected.Conditions.Add( rowSelectedCondition );
triggerSelected.Setters.Add( new Setter( Control.BackgroundProperty, Brushes.Khaki ) );

cellStyle.Triggers.Add( triggerNotSelected );
cellStyle.Triggers.Add( triggerSelected );
于 2012-08-31T20:47:57.433 に答える