Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Image ändern bei TreeView über DataTrigger
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

Image ändern bei TreeView über DataTrigger

beantworten | zitieren | melden

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>
private Nachricht | Beiträge des Benutzers
Quaneu
myCSharp.de - Member

Avatar #avatar-3126.jpg


Dabei seit:
Beiträge: 685
Herkunft: Regensburg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Quaneu am .
private Nachricht | Beiträge des Benutzers
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.813
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Quaneu
myCSharp.de - Member

Avatar #avatar-3126.jpg


Dabei seit:
Beiträge: 685
Herkunft: Regensburg

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Quaneu
myCSharp.de - Member

Avatar #avatar-3126.jpg


Dabei seit:
Beiträge: 685
Herkunft: Regensburg

beantworten | zitieren | melden

Zitat
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 :).
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

Hi a957m,
Zitat von 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
private Nachricht | Beiträge des Benutzers
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

beantworten | zitieren | melden

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;
        }
private Nachricht | Beiträge des Benutzers
Quaneu
myCSharp.de - Member

Avatar #avatar-3126.jpg


Dabei seit:
Beiträge: 685
Herkunft: Regensburg

beantworten | zitieren | melden

Könnte ich bitte noch die CBaseKnoten Klasse sehen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Quaneu am .
private Nachricht | Beiträge des Benutzers
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Quaneu
myCSharp.de - Member

Avatar #avatar-3126.jpg


Dabei seit:
Beiträge: 685
Herkunft: Regensburg

beantworten | zitieren | melden

Wenn du den Status änderst, änderst Du nicht das Feld, sonder schon das Property "Status"?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Quaneu am .
private Nachricht | Beiträge des Benutzers
a957m
myCSharp.de - Member



Dabei seit:
Beiträge: 254
Herkunft: Stuttgart

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers