Ändern der Hintergrundfarbe der ListView-Zeile programmgesteuert (wpf)

8

Ich habe eine Klasse, die eine ListView füllt, indem sie eine Liste von Objekten übergibt. Die Klasse verwendet Reflektion, um die Eigenschaften jedes Objekts zu sehen, um die ListView zu generieren. Wie kann ich die Hintergrundfarbe einer Zeile in der ListView ändern?

Diese Seite macht genau das, wonach ich suche. Das einzige Problem ist, dass mein ListView an die Liste der Objekte gebunden ist. Mit anderen Worten, jedes Element der ListView ist ein Objekt, das anstelle eines ListViewItem gebunden ist. Ich gehe davon aus, dass dies der Grund ist, warum ich ein Element in der ListView nicht in ein ListViewItem umwandeln kann. Zum Beispiel wenn ich das mache:

%Vor%

Ich bekomme eine InvalidcastException, denn wenn ich die Objekte physisch zum ListView hinzufügen möchte wie:

listview.items.add (someObject), dann wird das funktionieren, aber da ich die Liste an die ListView bin, funktioniert diese Zeile nicht. Ich denke, das ist der Grund, warum ich nicht in der Lage bin zu wirken. Der Grund, warum ich es umwandeln möchte, ist, weil ein ListViewItem eine Background-Eigenschaft besitzt.

BEARBEITEN

Ich kann das mit den ersten 12 Objekten, die ich ausprobiert habe, machen:

%Vor%

und ich bekomme diesen Fehler:

und ich habe es auch versucht:

%Vor%

und ich bekomme den gleichen Fehler:

Ich verstehe nicht, warum lvitem nach der 12 Iteration null ist?

Es funktioniert nur mit den angezeigten Elementen ....

    
Tono Nam 30.05.2011, 01:15
quelle

5 Antworten

3

Wenn Sie ItemContainerGenerator verwenden, beachten Sie, dass die Container asynchron generiert werden. Der Generator macht ein Statusänderungsereignis verfügbar, das Sie hören könnten:

%Vor%

Nicht sicher, ob das seltsame Zeichnungseffekte (Flackern) erzeugt oder nicht.

Eine weitere Option, statt die Listenansichtselemente im Code zu erstellen, besteht darin, Datenvorlagen zu verwenden. Möglicherweise müssen Sie Ihrem Ansichtsmodell jedoch einige Eigenschaften für Anzeigezwecke hinzufügen.

    
ChrisWue 30.05.2011, 03:01
quelle
9

Sie müssen ViewModels einführen, anstatt die WPF-Benutzeroberfläche zu zerlegen. z.B. Ich könnte einen wie folgt erstellen

%Vor%

Erstellen Sie als Nächstes eine Liste solcher Objekte als eine Eigenschaft in Ihrem DataContext, damit Ihr ListView daran binden kann.

%Vor%

Jetzt müssen Sie lediglich Ihren ListView an diese Sammlung binden und den DataContext der Benutzeroberfläche richtig verkabeln

%Vor%

Jetzt ist es einfach, die Hintergrundfarbe zu ändern. Setzen Sie einfach die Eigenschaft des entsprechenden ItemVM-Objekts auf die gewünschte Farbe. z.B. um alle Elemente auf PaleGreen zu setzen

%Vor%     
Gishu 30.05.2011 09:09
quelle
3

Sie können die ItemContainerGenerator verwenden, z. B.

%Vor%

Allerdings wird ListView standardmäßig virtualisiert, das heißt ListViewItems wird bei Bedarf erzeugt (nur wenn das Element tatsächlich in der Liste sichtbar ist), daher werden die obigen Methoden keine Container für Elemente zurückgeben, die es sind derzeit nicht sichtbar.

In diesem Fall ist es normalerweise vorzuziehen, eine Bindung für die Eigenschaft Background über ein Setter im ItemContainerStyle .

    
H.B. 30.05.2011 01:41
quelle
1

Angenommen, die Elemente in Ihrer ListBox sind vom Typ Foo , und in der ListBox werden Foo.ItemInfo für jedes Foo-Objekt angezeigt, und abschließend gibt es eine Eigenschaft Mit Status wird festgelegt, wie jedes Foo.ItemInfo in der ListBox in Bezug auf Hintergrund, Vordergrund, Schriftstil und QuickInfo angezeigt werden soll. Fügen Sie basierend auf diesen Anforderungen in Ihrem XAML Folgendes hinzu:

%Vor%

Fügen Sie als Nächstes in C #:

Folgendes in Ihre MainWindow.xaml.cs (oder wie auch immer Sie die XAML-Begleitdatei genannt haben) ein %Vor%

Dies ist eine Art, die ich gefunden habe, die funktioniert ... es gibt keinen Zweifel, viele andere Möglichkeiten, und Ihre Laufleistung kann variieren ...

Auf jeden Fall, HTH

    
John 05.07.2013 17:28
quelle
1

Nach einigem googlen habe ich meine eigene Lösung gefunden Ich benutze Listview.ItemsSource und als Quelle benutze ich List Dann kann ich den Hintergrund von specify ListViewItem in List festlegen und nur Listview aktualisieren.

XAML:

%Vor%

Füllen Sie ListView mit Elementen mit grauem Hintergrund:

%Vor%

Methode für Zeilenänderungsfarbe erstellen:

%Vor%

Und benutze es:

%Vor%     
CoRe23 05.03.2017 22:34
quelle

Tags und Links