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
Um den Trigger hinzuzufügen brauchst du das DataTemplate.
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????
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.
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...
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.
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:)
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.
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.
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.
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.
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.
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?
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
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