Laden...

Wie färbe ich eine DataGrid Row dynamisch ein?

Erstellt von CoderboyPB vor 3 Jahren Letzter Beitrag vor 3 Jahren 765 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren
Wie färbe ich eine DataGrid Row dynamisch ein?

Hallo,
ich habe die ItemsSource an die Files Property meines ViewModels gebunden, welche vom Typ List<FileModel> ist.


public class FileModel
{
    public string Title { get; set; }
    public string URL { get; set; }
    public bool Download { get; set; }
    public DownloadStatus Status { get; set; }
}

 public enum DownloadStatus
    {
        Undefined,
        Loading,
        Loaded
    }

Nun möchte ich die Zeile, wenn der Wert von Status gleich DownloadStatus.Undefined ist, grün einfärben.
Der Style passt, das habe ich schon sicherstellen können, aber warum funktioniert der DataTrigger nicht, was mache ich da falsch?


<DataGrid.Resources>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=Status}" Value="DownloadStatus.Undefined">
                                    <Setter Property="Background" Value="Green"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.Resources>

2.078 Beiträge seit 2012
vor 3 Jahren

Schreib mal nur "Undefined" als Value.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

So, ich hab's dann doch noch im aller Letzten Versuch gefunden


<DataGrid.RowStyle>
                        <Style TargetType="DataGridRow">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Status}" Value="0">
                                    <Setter Property="Background" Value="green"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.RowStyle>

Was allerdings nicht funktioniert ist das Abfragen des Enums in WPF, weshalb ich jetzt einfach auf Integers ausgewichen bin.

Falls es doch mit Enums auch möglich ist, wie frage ich das in der Value-Property des DataTriggers ab?

2.078 Beiträge seit 2012
vor 3 Jahren

Was allerdings nicht funktioniert ist das Abfragen des Enums in WPF, weshalb ich jetzt einfach auf Integers ausgewichen bin.

Falls es doch mit Enums auch möglich ist, wie frage ich das in der Value-Property des DataTriggers ab?

Schreib mal nur "Undefined" als Value.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

Hey Nice, hat Funktioniert.
Danke 😃

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

Wie bereits gesagt, es funktioniert, allerdings wird die letzte der ausgewählten Zeilen nicht mehr komplett eingefärbt: siehe Anhang.

Wenn man aber eine andere Zeile anklickt, wird die komplette Zeile grün, die Information kommt also an, nur wird sie in der UI nicht gesetzt.

Irgendwie sieht das nicht besonders schön aus, kann man da irgendwas machen, dass nach Abarbeitung aller Downloads die KOMPLETTE Zeile grün ist?

5.657 Beiträge seit 2006
vor 3 Jahren

Mich wundert ja, daß es überhaupt so funktioniert. Wo wird denn in deinem Code das NotifyPropertyChanged-Ereignis ausgelöst? Poste doch mal dein ViewModel mit dem Code, wo du den Status änderst.

Weeks of programming can save you hours of planning

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

Da das Ändern des Zustandes im Model selbst passiert, muss INotifyPropertyChanged auch in das Model rein, du findest es also hier:


public class FileModel : INotifyPropertyChanged
    {
        public string Title { get; set; }
        public string URL { get; set; }
        public bool Download { get; set; }
        private DownloadStatus _status;

        public DownloadStatus Status
        {
            get { return _status; }
            set 
            {  
                _status = value;
                OnPropertyChanged(nameof(Status));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

https://github.com/CoderboyPB/PocherUI/blob/master/PocherUI/Models/FileModel.cs