Laden...

WPF DataGridRow Style basierend auf dem EntitySate

Erstellt von schmuserkadser vor 5 Jahren Letzter Beitrag vor 5 Jahren 872 Views
S
schmuserkadser Themenstarter:in
1 Beiträge seit 2019
vor 5 Jahren
WPF DataGridRow Style basierend auf dem EntitySate

Hallo liebe Leute,
ich hoffe ihr könnt mir helfen.

Ich bin auf der Suche nach einer passenden Umsetzung für mein Problem (logisch .. ).
In meiner Applikation nutze ich ein einfaches DataGrid innerhalb meiner WPF-Anwendung.

Daten lade ich über das EF6 und binde es in meinem MVC in eine CollectionViewSource.
Diese werden auch richtig in meiner WPF-Anwendung angezeigt. CRUD ist kein Problem - funktioniert auch schön.

CollectionViewSource muss ich nicht unbedingt verwenden, Filtern oder Gruppieren findet nicht statt.

Ich habe im Ansatz eine ConverterClass erzeugt, um ein EntityState in eine "SolidBrush" zu verwandeln.

Converter-Klasse:

using System;
using System.Drawing;
using System.Globalization;
using System.Windows.Data;

namespace Maschinenpflege.Converters
{
    public class RowStateToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var val = (System.Data.Entity.EntityState)value;
            switch (val)
            {
                case System.Data.Entity.EntityState.Added:
                    return new SolidBrush(Color.Green);
                case System.Data.Entity.EntityState.Deleted:
                    return new SolidBrush(Color.Red);
                case System.Data.Entity.EntityState.Modified:
                    return new SolidBrush(Color.Yellow);
                case System.Data.Entity.EntityState.Unchanged:
                    return new SolidBrush(Color.Aqua);

            }
            return new SolidBrush(Color.Black);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Mein WPF-DataGrid, sieht so aus:

  <DataGrid
            Grid.Row="3"
            Grid.Column="1"
            ItemsSource="{Binding ColView.Source,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
            AutoGenerateColumns="False"
            CanUserAddRows="False"
            Name="MaschinenGrid"
            RowStyle="{StaticResource RowStateStyle}"
            SelectedItem="{Binding SelectedMachine,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<!-- Columns hier -->
  </DataGrid.Columns>
 </DataGrid>

MVC-Klasse:



        private DbSet<Maschinen> _MaschinenDBSet;

        public DbSet<Maschinen> MaschinenDBSet
        {
            get { return _MaschinenDBSet; }
            set { _MaschinenDBSet = value;
                NotifyPropertyChanged();
            }
        }

   privat DALLayer.Stammdaten.MaschinenpflegeCTX _DataLayer;

        public DALLayer..Stammdaten.MaschinenpflegeCTX DataLayer
        {
            get { return _DataLayer; }
            set { _DataLayer = value;  NotifyPropertyChanged(); }
        }

 public MainMVMC()
{
 _DataLayer = new DALLayer.Stammdaten.MaschinenpflegeCTX();
NeuList = _DataLayer.LeseMaschinenSet();
                NeuList.Load();
                ColView.Source = NeuList.Local;
}

Die Daten sind ja richtig gebunden, nur wie binde ich das EntityState aus der ConverterClass richtig?

Natürlich bekomme ich den BindingPathError weil es das EntityState ja nicht in der Object Klasse "Maschinen" gibt.

Ich bin schon länger auf der Suche, finde aber leider keine richtige Lösung.
Früher habe ich das über DataGrids gelöst, dort gab es RowStates. Dann wurde ein DataTrigger eingerichtet und es lief, im Bereich EF und WPF bin ich aber ein bisschen allein habe ich das Gefühl.

Hoffe ihr könnt mir helfen !

Vielen Dank!

W
955 Beiträge seit 2010
vor 5 Jahren

Hallo,
Modellobjekte haben heute kein Verweis auf das EF mehr, ein solcher wird als Architekturfehler angesehen. Du könntest mit dem ChangeTracker des EF-Contexts rumspielen was aber genaugenommen eine Schichtenverletzung darstellt: das Modellobjekt sollte nicht wissen wie es gespeichert wird.
Du könntest Dir alternativ mal überlegen dies manuell zu implementieren: man bräuchte ein bool als field im Modellobjekt um sich zu merken ob das Objekt verändert wurde. Das kann gesetzt werden wenn ein Setter des Objektes aufgerufen wurde. (Zusätzlich IChangeTracking implementieren um den Status rücksetzen zu können.) Dann könnte man ein Property ChangeStatus bauen welches den Status ermittelt (Added -> prim key is default, Unchanged -> bool is false, Modified -> bool is true)