Laden...

Image ändern bei TreeView über DataTrigger

Erstellt von a957m vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.667 Views
A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren
Image ändern bei TreeView über DataTrigger

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>
692 Beiträge seit 2008
vor 11 Jahren

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

A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren

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.

6.911 Beiträge seit 2009
vor 11 Jahren

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!"

692 Beiträge seit 2008
vor 11 Jahren

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?

A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren

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.

692 Beiträge seit 2008
vor 11 Jahren

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 😃.

5.657 Beiträge seit 2006
vor 11 Jahren

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

A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren

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;
        }
692 Beiträge seit 2008
vor 11 Jahren

Könnte ich bitte noch die CBaseKnoten Klasse sehen?

A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren

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
692 Beiträge seit 2008
vor 11 Jahren

Wenn du den Status änderst, änderst Du nicht das Feld, sonder schon das Property "Status"?

A
a957m Themenstarter:in
254 Beiträge seit 2007
vor 11 Jahren

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.