Laden...

DataGrid: Editierende Row Schriftfarbe ändern

Erstellt von oehrle vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.426 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 10 Jahren
DataGrid: Editierende Row Schriftfarbe ändern

Hallo, folgendes Problem bei einer DataGridRow die editiert wird.
Wird eine Zelle angesptrungen, werden alle Texte in der DataGridRow in weisser Schriftfarbe dargestellt. Das ist natürlich schlecht, weil ich die Tabellenspalten farblich voneinander abgestzt habe (damit User besser erkenne kann was zusammen gehört). Wie kann ich das einstellen, das die Schriftfarbe während dem editieren z.B. rot ist?
Da muss ich doch irgendwie an den CellSyle ran, beim Ereignis ""BeginningEdit", oder?
Normalerweise wäre das nicht der Fall ,wenn ich die Spalten nicht verschiedenfarbig einefärbt hätte.

Wichtig zu wissen, dass ich das im CodeBehind realisiere, da meine Tabellen dynamisch sind. Kann mir da jemand einen Tipp geben?

S
753 Beiträge seit 2006
vor 10 Jahren

Nur ein Hinweis, der eventuell in die richtige Richtung führt:
Meiner Meinung nach, müsstest du in der Lage sein, ein Style mit einem Trigger zu definieren, der auf die Row angewendet wird, wenn der korrekte Trigger, wie "BeginEdit"? gefeuert wird. Im Style kannst du dann die Farbe ändern.
(ungetestet)

Life is a short

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 10 Jahren

Hallo, nach langer Zeit (gestern) getestet. Mußte mich damit erst auseinandersetzen, weil ich mit XAML nicht soviel mache (viel dynamisch in Code Behind).
Aber es hat auch ein Stück weit funktioniert. Mein Window mit dem DataGrid wird auch in CodeBehind erstellt, und die Daten aus einer Tabelle geladen und visualisiert. Die Tabelle hat über 50 Spalten und es sind immer verschiedene Blöcke von Spalten die zu einer Gruppe gehören. Diese Gruppen habe ich eingefärbt, und das passiert sobald das Ereignis "DataGrid.Loaded" feuert. Dann sieht der Code so aus:


 private void dg_Loaded(object sender, RoutedEventArgs e)
        {
            //// Spalte "Datum" kann nicht editiert werden
            (sender as DataGrid).Columns[4].IsReadOnly = true;

            //// Hintergrundfarbe der Spalte festlegen
            for (int i = 0; i < (sender as DataGrid).Columns.Count; i++)
            {
                if (i <= 4)
                {
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.LightGreen)  /*, new Setter(ContentControl.ForegroundProperty, Brushes.DarkBlue)*/ }
                     };
                }
                else if (i <= 14)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.LightYellow) /*, new Setter(ContentControl.ForegroundProperty, Brushes.DarkBlue)*/ }
                    };
                else if (i <= 24)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.Yellow) }
                    };
                else if (i <= 34)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.Orange) }
                    };
                else if (i <= 44)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.LightGoldenrodYellow) }
                    };
                else if (i <= 54)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.Goldenrod) }
                    };
                else if (i <= 56)
                    (sender as DataGrid).Columns[i].CellStyle = new Style()
                    {
                        Setters = { new Setter(ContentControl.BackgroundProperty, Brushes.LightGray) }
                    };
                }
        }

Mein Style mit dem Trigger habe ich in eine Resourcendatei geschrieben, aus der ich den Style mit den Triggereinstellungen hole. Leider werden bei den Triggern die Schriftfarbe (Foreground) oder die Hintergrundfarbe (Background) nicht verändert. Ich habe aber bemerkt, warum das so ist. Das hängt mit den Einstellungen in dem oben gezeigten Ereignis zusammen. Entferne ich diese Einstellungen, dann kommen alle Triggereinstellungen durch.

Hier der Style:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  
    
    <Style x:Key="DgEditRowStyle" TargetType="DataGridRow">
        <!--    Hilfe aus einem Forum, hier der Link: http://stackoverflow.com/questions/1223280/how-can-i-set-the-color-of-a-selected-row-in-datagrid
                Hier werden die Systemeigenschaften überschrieben.
        -->
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue" />
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
        </Style.Resources>
        
                <!--    Die eigentlichen Trigger die ich verwenden: -->
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Black"/>
                <Setter Property="Foreground" Value="Red"/>
                <Setter Property="FontSize" Value="20"/>
            </Trigger>
			
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Black"/>
                <Setter Property="FontSize" Value="17"/>
            </Trigger>
			
        </Style.Triggers>
    </Style>

</ResourceDictionary>

Was aber noch hilft (siehe Style, wenn ich die Systemresourcen überschreibe, was ich aber eigentlich nicht möchte.

Mir fehlt jetzt da die Idee. Wie mache ich das?