Laden...

DataTrigger im Code behind hinzufügen

Erstellt von gelöschtem Konto vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.972 Views
Gelöschter Account
vor 13 Jahren
DataTrigger im Code behind hinzufügen

Hallo,
ich würde gerne eine Liste, die im Code behind generiert wird, mit einem DataTrigger erweitern (also eine Spalte davon).

Die Liste wird folgendermassen erstellt:


createList(new machineEntries().listNamesAll, new machineEntries().bindingNamesAll, "Alle Geräte");

Folgendenden DataTrigger würde ich nun in dieser Liste anwenden:


        <DataTemplate x:Key="flagImage">
            <Image x:Name="GuiFlagImages" Width="18" Height="18"/>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=INSTOCK}" Value="True">
                    <Setter TargetName="GuiFlagImages" Property="Source" Value="images/ok.png" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=INSTOCK}" Value="False">
                    <Setter TargetName="GuiFlagImages" Property="Source" Value="images/notok.png"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>

Wie bringe ich diesen XAML Code in meine Liste? (Also generisch)?

Danke für die Hilfe

L
862 Beiträge seit 2006
vor 13 Jahren

Um den Trigger hinzuzufügen brauchst du das DataTemplate.

Gelöschter Account
vor 13 Jahren

Ein bisschen ausführlicher hätte es schon sein dürfen. Ich habe doch hier ein DataTemplate, wie gebe ich das aber der liste bzw. der einzelnen Spalte mit??

In XAML würde das so aussehen:


<GridViewColumn Header="" CellTemplate="{StaticResource pdfImage}"/>

Aber wie bringe ich das in den COde behind????

L
862 Beiträge seit 2006
vor 13 Jahren

Einen DataTrigger kannst du so zu einem DataTemplate hinzufügen:

DataTemplate t = ?;
t.Triggers.Add(deinTrigger);

Ein DataTemplate kannst du so einer ListBox (w/e) zuweisen:


ListBox l = ?;
l.ItemTemplate = deinDataTemplate;

Ich habe jedoch die Vermutung dass du nicht so genau weist was du eigendlich willst.
Vielleicht schaust du dir mal die Eigenschaften StyleSelector und TemplateSelector an. Damit kannst du in XAML einen Style/Template zuweisen welches du im Code auswählst.

Gelöschter Account
vor 13 Jahren

Also ich will folgendes:

Eine Liste zur Laufzeit generieren, inkl Tabellennamen und Bindings (das klappt). Gewisse Tabellen haben aber als Wert True und False, und anstatt True/False möchte ich ein Image anzeigen. In XAML wäre das kein Problem, aber wie ich das im Code generiere ist mir ein Rätsel...

L
862 Beiträge seit 2006
vor 13 Jahren

Nun warum machst du es dann nicht einfach in XAML 😉?

Nur weil die Liste dynamisch ist heisst das nicht dass man sie unbedings im Code-Behind generieren muss. Die ganzen Tabellenheader lassen sich bestimmt auch per Bindings setzen. Evtl. musst du halt auf einen Converter zurückgreifen.

Wenn dus unbedings im CodeBehind machen willst würde ich dir allerdings vom Trigger abraten da du hier auch direkt die Controls ansprechen kannst was in diesem Fall praktischer, wenn auch nicht sehr sauber wäre.

Gelöschter Account
vor 13 Jahren

Und wie würde das im XAML gehen? Muss ich dann den bisherigen Code wieder über den haufen kippen?

Meine bisheriger List-Generator sieht so aus:


grid.ColumnHeaderToolTip = tableName;
                for (int i = 0; i < listNames.Length; i++)
                {
                    gridCol = new GridViewColumn();
                    gridCol.DisplayMemberBinding = new Binding(bindings[i].ToUpper());  // Binding TODO
                    gridCol.Header = listNames[i];
                    grid.Columns.Add(gridCol);
                    
                }
                listView1.View = grid;

Und diesem möchte ich jetzt noch einen Trigger mitgeben, oder einfach etwas, dass mir die True/False in der LIste durch Bilder ersetzt. Über einen Code-Ansatz/Beispiel wäre ich sehr dankbar, ich bin noch kein C#-Crack:)

L
862 Beiträge seit 2006
vor 13 Jahren

Ich habe zwar noch nicht wirklich mit der ListView gearbeitet aber ich würde in etwa so vorgehen:

Die Columns selbst weist du über ein Binding zu (ich nehme an du benutzt MVVM). Evtl. musst du einen Converter einsetzen oder ein kleine Behavior schreiben da in .NET 3.5 (ka wie es im 4.0 ist) die Columns keine DependencyProperties sind.

Jetzt solltest du in XAML freie Hand haben und deine Trigger ohne Probleme zuweisen können.

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

der von Lector angesprochene Converter ist doch die einfachste Möglichkeit. Einfach nen ValueConverter schreiben, welcher für nen boolschen Wert das jeweilige Image raussucht aus den Resourcen und dann kannst du damit dein Image direkt gegen die boolschen Werte aus deinen Daten binden. Da brauchst du keine Trigger.

Baka wa shinanakya naoranai.

Mein XING Profil.

Gelöschter Account
vor 13 Jahren

Cool, mach ich gerne, leider kann ich mir absolut nichts vorstellen darunter:) Wie baue ich denn einen Converter zur Laufzeit? Ihr schreibt alles so selbstverständlich, ein paar Zeilen Code oder ein Link zu einem Beispiel wäre da schon hilfreich...

6.862 Beiträge seit 2003
vor 13 Jahren

Wieso sollte sich der Valueconverter ändern? Der macht doch immer das gleiche. Den boolschen Wert in ein Image wandeln. Oder gibt es für einen boolschen Wert mehrere mögliche Bilder? Selbst da könntest du den Converter einfach Paramter mitgeben nach denen du entscheiden kannst welches Bild angezeigt wird, der Converter an sich ist vollkommen statisch. Was sich ändert sind die Properties gegen die gebunden wird, aber net der Converter.

Baka wa shinanakya naoranai.

Mein XING Profil.

Gelöschter Account
vor 13 Jahren

Also kommt der COnverter ins XAML?

6.862 Beiträge seit 2003
vor 13 Jahren

Der zu benutzende Converter wird immer beim Binding mit angegeben, je nachdem wo du das definierst musst du dort halt auch dein Converter mit angeben.

Implementiert wird nen Converter aber immer in C#.

Baka wa shinanakya naoranai.

Mein XING Profil.

Gelöschter Account
vor 13 Jahren

So sieht mein Binding aus:



                    gridCol = new GridViewColumn();
                    gridCol.DisplayMemberBinding = new Binding(bindings[i].ToUpper());  // Binding TODO
                    gridCol.Header = listNames[i];
                    grid.Columns.Add(gridCol);

und wo gebe ich da jetzt den Converter an??

6.862 Beiträge seit 2003
vor 13 Jahren

Da wo dein Todo steht. Schau dir einfach mal die Binding Klasse an, da gibts Beispiel wie man die auch im Code ausführlicher definiert. Du benutzt ja nur nen einfachen Konstruktor.

Baka wa shinanakya naoranai.

Mein XING Profil.

Gelöschter Account
vor 13 Jahren

Sorry für meine späte Antwort, ich habe das Problem aussen vor gelassen, ist jetzt aber wieder aktuell:)

Also das Binding nimmt nur einen string entgegen und das klappt auch Prima. Jetzt steht in der listview einfach true oder false. Früher habe ich das im XAML via CellTemplate gelöst. Jetzt ist aber alles im Code Behind.

Vermutlich ist meine Frage zu einfach:) Ich möchte eigentlich nur einem Header ein Celltemplate hinzufügen.

Im XAML würde das so aussehen:


<GridViewColumn Header="Gelesen" CellTemplate="{StaticResource readedImage}"  />

Im Code behind müsste das irgendwie so aussehen (Pseudo-COde):


GridViewColumn gridCol;
gridCol.Header.Add.CellTemplate = ="{StaticResource readedImage}" ;

Jetzt meine Frage: wie müsste es in echt aussehen?

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo gijoe222,

du kannst ja einfach das CellTemplate von der GridViewColumn setzen (identisch wie beim XAML).

Um etwas aus den Resourcen zu laden kannst du **:::

Gruss
Michael

Gelöschter Account
vor 13 Jahren

Danke, hat endlich geklappt, der Tipp mit dem FindResource war unter anderem ausschlaggebend. Die Lang ersehnte Zeile sieht nun wie folgt aus:


 gridCol.CellTemplate = (DataTemplate)FindResource("sold");

Wobei sold ein im XAML erstelltes Template ist (inkl. Binding) => steht ganz am Anfang des Threads als flagImage

Danke euch allen