Kolor zaznaczonego wiersza w WPF DataGrid

0

Witam.
Mam taki problem.
Jeżeli DataGrid w WPF jest rozciągnięty w poziomie na całe okno to może się zdarzyć, że kolumny nie wypełnią całego okna i kontrolka wypełni pozostałą przestrzeń pustą kolumną.
I pytanie:
W jaki sposób zmusić DataGrid'a aby w tej pustej kolumnie wypełniał kolorem zaznaczony wiersz. Standardowo jak zaznaczymy wiersz w DataGridzie, to pokoloruje tylko kolumny zdefiniowane, natomiast tą pustą kolumnę nie ruszy.
Problem polega na tym, że gdy koloruję wiersze w zależności od danych to ta pusta kolumna jest wypełniana, natomiast na zaznaczonym wierszu zmiana Background'u kończy się na zdefiniowanych kolumnach.
Dostałem zadanie aby ta pusta kolumna też była wypełniana kolorem podczas zaznaczenia.
I proszę nie piszczcie że mogę zlikwidować tę pustą kolumnę poprzez rozciągnięcie kolumn lub wyrównanie grid'a do lewej. Już to sprawdziłem ale efekt nie zadowolił zlecającego :(
Może ktoś ma jakiś pomysł?

PW

0

Nie ma czegoś takiego jak pusta kolumna. Po prostu rozciąga się DataGrid. Zdowalającym efektem będzie dodanie kolumny z pustym headerem. Wtedy rozciągnij go i gotowe

0

Nie zrobisz tego. "W jaki sposób zmusić DataGrid'a aby w tej pustej kolumnie wypełniał kolorem zaznaczony wiersz." - Nie ma możliwości zrobienia tego, ponieważ tam nie ma żadnych wierszy. To jest tło tylko i wyłącznie. Nie klikniesz w to.
Możesz wypełnić to tło w taki sposób:

        <Grid Background="Red" >
            <DataGrid ItemsSource="{Binding Path=Elements}" HorizontalAlignment="Left"/>
        </Grid>

lub dodać pustą kolumnę i wtedy możesz nią sterować.

             <DataGrid ItemsSource="{Binding Path=Elements}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=l1}" Header="Liczba 1"/>
                    <DataGridTextColumn Binding="{Binding Path=l2}" Header="Liczba 2"/>
                    <DataGridTextColumn Binding="{Binding Path=l3}" Header="Liczba 3"/>
                    <DataGridTextColumn Binding="{Binding Path=l4}" Header="Liczba 4"/>
                    <DataGridTemplateColumn Width="*">
                        <DataGridTemplateColumn.CellStyle>
                            <Style TargetType="DataGridCell">
                                <Style.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter Property="Background" Value="Red"/>
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="False">
                                        <Setter Property="Background" Value="Gray"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGridTemplateColumn.CellStyle>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

Możesz również użyć ScrollViewer

<ScrollViewer HorizontalScrollBarVisibility="Auto" CanContentScroll="True">
                <DataGrid ItemsSource="{Binding Path=Elements}" AutoGenerateColumns="False" HorizontalAlignment="Left">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Path=l1}" Header="Liczba 1"/>
                        <DataGridTextColumn Binding="{Binding Path=l2}" Header="Liczba 2"/>
                        <DataGridTextColumn Binding="{Binding Path=l3}" Header="Liczba 3"/>
                        <DataGridTextColumn Binding="{Binding Path=l4}" Header="Liczba 4"/>
                        <DataGridTemplateColumn Width="*">
                            <DataGridTemplateColumn.CellStyle>
                                <Style TargetType="DataGridCell">
                                    <Style.Triggers>
                                        <Trigger Property="IsSelected" Value="True">
                                            <Setter Property="Background" Value="Red"/>
                                        </Trigger>
                                        <Trigger Property="IsSelected" Value="False">
                                            <Setter Property="Background" Value="Gray"/>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </DataGridTemplateColumn.CellStyle>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </ScrollViewer>

jedyna opcja jaka przychodzi mi na myśl, to wykrywać, czy Scrollbar pojawił się i analogicznie ukrywać lub pokazywać tą ostatnią kolumnę

0

Dziękuję za wszystkie podpowiedzi.
Problem okazał się banalnie prosty. Wystarczyło w stylu dla DataGridRow dodać następującego triggera:

<Style.Triggers>
   <Trigger Property="IsSelected" Value="True">
       <Setter Property="Background" Value="{StaticResource gridRowFormHiglightGradientBrusch}"/>
   </Trigger>
</Style.Triggers>

co wypełniło tło zaznaczonego wiersza do końca widoku.
Oczywiście stała "gridRowFormHiglightGradientBrusch" to zdefiniowany kolor podświetlenia ale nic nie stoi na przeszkodzie aby wykorzystać tu binding do aktualnego koloru zaznaczenia w DataGrid'zie.

0

"aby w tej pustej kolumnie wypełniał kolorem zaznaczony wiersz". Gdybym wiedział, że chcesz pokolorować cały wiersz to od razu bym Ci dał to rozwiązanie :d

1 użytkowników online, w tym zalogowanych: 0, gości: 1