Hallo Kollegen,
bräuchte eine konkrete Anregung. Hab einiges zu dem Thema gefunden und hatte auch das Gefühl, dass ich schon langsam etwas mit der WPF machen kann, aber nun dies...
Hab Objekte mit der Eigenschaft Status in einem Baum visualisiert. Abhängig von Status sollen unterschiedliche Images vor den Items angezeigt werden. Dies passiert dummerweise nicht, es wird immer das gleiche angezeigt.
Die Objekte habe ich über den DataContext an das jeweilige TreeViewItem gebunden. Hat jemand eine Idee
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate DataType="my:CBaseKnoten">
<StackPanel Orientation="Horizontal">
<Image Name="Bild" Width="16" Height="16" Source="Images\Saved.png"/>
<TextBlock Text="{Binding}" Margin="5"/>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Status}" Value="True">
<Setter Property="Image.Source" Value="Images\Changed.png" TargetName="Bild"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Hallo,
ich würde mich ganz einfach an Status binden und über einen Converter das Image bzw. den "Pfad" zurückgeben lassen.
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate DataType="my:CBaseKnoten">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Status, Converter={StaticResource statusToImageConverter}"/>
<TextBlock Text="{Binding}" Margin="5"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
In deinem Fall könnte sein, das der DataContext nicht stimmt und somit das Binding nicht funktioniert?
Schöne Grüße
Quaneu
Hallo Quaneu,
die Lösung über einen Converter habe ich relativ häufig bei meiner Suche im Internet gefunden. Scheint relativ gängig zu sein, aber aus meiner Sicht nicht sehr schön, ich würde ja schon gern alles in XAML machen.
Der DataContext sollte ja eigentlich schon stimmen, da die Texte im Tree korrekt angezeigt werden.
Danke für Deine Unterstützung.
Hallo a957m,
mach für das Image einen Style und dort definierst du den DataTrigger. Im Setter gibst du dann als Property nur "Source" und nicht "Image.Source" an (denn für das Image gibt es keine Eigenschaft Image.Source, sondern nur die Source-Eigenschaft).
Schau dir mal an wie WPF bei DepedencyProperties die Werte bezieht -> gibt als die Source vom Image außerhalb des DataTriggers nicht an, denn dieser zählt sonst nicht.
D.h. auch dass ev. 2 DataTrigger nötig sind.
Alternativ kannst du im DataTrigger per StoryBoard und ObjectAnimationUsingKeyFrames die Source-Eigenschaft ändern.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Nix zu danken .
Im Output bzw. im Immediate Window kommen also keine Fehler? Und Du benutzt auch das Interface
INotifyPropertyChanged, damit die GUI deine Änderungen mitbekommt?
Hi,
hab nach Euren Anregungen noch mal meinen Code durchforstet und festgestellt, dass in der Code-Behind Datei die Text-Eigenschaft für den TextBlock gesetzt wird. Mache ich dies über XAML werden keine Texte mehr angezeigt. Damit ist die Vemutung von Quaneu nun doch bestätigt. Nur was kann da falsch laufen ? Beim Erzeugen der TreeViewItem Objekte setzte ich den DataContext auf das jeweilige Objekt.
Im Output bzw. im Immediate Window kommen also keine Fehler? Und Du benutzt auch das Interface
INotifyPropertyChanged, damit die GUI deine Änderungen mitbekommt?
Am besten ist es Du zeigst mal wie Du die TreeViewItems erzeugst.
Noch schöner ist es natürlich, den TreeView per HierarchicalDataTemplate zu füllen. Dann hast Du alles in XAML 😃.
Hi a957m,
...in der Code-Behind Datei die Text-Eigenschaft für den TextBlock gesetzt wird. Mache ich dies über XAML werden keine Texte mehr angezeigt.
Soetwas hatte ich mir schon fast gedacht, aber wenn es Binding-Fehler gibt, werden die im Output-Window ausgegeben. Ansonsten würde ich dir wie Quaneu gesagt hat auch empfehlen, das HierarchicalDataTemplate (in Verbindung mit MVVM) zu verwenden.
Christian
Weeks of programming can save you hours of planning
Hi,
anbei ein Auszug der Code-Behind Datei:
private void AddItem2Tree(CBaseKnoten _knoten, TreeViewItem _item)
{
foreach (CBaseKnoten bk in _knoten.Children)
{
TreeViewItem subitem = MakeTreeViewItem(bk);
_item.Items.Add(subitem);
AddItem2Tree(bk, subitem);
}
}
private TreeViewItem MakeTreeViewItem(CBaseKnoten _knoten)
{
TreeViewItem item = new TreeViewItem();
item.DataContext = _knoten;
item.Tag = _knoten;
return item;
}
Auszüge aus der Klasse:
public abstract class CBaseKnoten : IValidierbar, INotifyPropertyChanged
{
#region Member Variablen
protected CBaseKnoten m_parent;
protected bool m_status;
#endregion
...
[XmlIgnore]
public bool Status
{
get { return m_status; }
set
{
m_status = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Status"));
}
}
...
#region Ereignisse
public event PropertyChangedEventHandler PropertyChanged;
#endregion
Wenn du den Status änderst, änderst Du nicht das Feld, sonder schon das Property "Status"?
Ja, klar. Ich habe aber auch schon das Problem, dass die Texte nicht richtig angezeigt werden.
Ich werde wohl versuchen mit dem HierarchicalDataTemplate die Items zu befüllen. Dort brauche ich ja aber auch wieder den Value-Converter.
Vielen Dank für Eure Unterstützung.