none
Binding in Setter.Value RRS feed

  • Frage

  • Hallo,

    folgendes Szenario: Wenn ich einen Tooltip wie folgt binde:

     <ToolTip x:Key="YourToolTip" >
         <StackPanel>
              <TextBlock Text="{TemplateBinding Ferienbeschreibung}"/>
         </StackPanel>
    </ToolTip>

    Dann klappt alles wunderbar! Nun setze ich Trigger, und bei einem True wird der Tooltip vom Setter gesetzt. Somit habe ich 3 Tooltips, welche bei bestimmten bedingungen aktiv sind. Leider lässt sich die "Ferienbeschreibung" nicht binden, egal wie ich es anstelle...

    Bereits versucht habe ich:

    <TextBlockText="{BindingRelativeSource={RelativeSourceTemplatedParent},Path=Ferienbeschreibung}"/>

    und:

    <TextBlockText="{BindingRelativeSource={RelativeSourceFindAncestor,AncestorType={x:Typecontrols:CalendarButton}},Path=Property.Ferienbeschreibung}"></TextBlock>

    beide lassen das Textfeld leer erscheinen. Ist das evtl. zu verzwickt was ich vorhabe? Hier nochmal der ganze Code (Zum Verständnis)

    <MultiDataTrigger>

    <MultiDataTrigger.Conditions>

    <ConditionBinding="{BindingPath=Feiertag,RelativeSource={RelativeSourceTemplatedParent}}"Value="True"/>
    <ConditionBinding="{BindingPath=FuenfTageWoche,RelativeSource={RelativeSourceTemplatedParent}}"Value="True"/>

    </MultiDataTrigger.Conditions>

    <MultiDataTrigger.Setters>

    <SetterProperty="ToolTipService.IsEnabled"Value="True"/>

    <SetterProperty="ToolTip">

    <Setter.Value>

    <StackPanel>

    <TextBlockFontWeight="Bold"Text="Feiertag und 5TageWoche"></TextBlock>

    <TextBlockText="{BindingRelativeSource={RelativeSourceTemplatedParent},Path=Ferienbeschreibung}"/>

    <TextBlockText="{BindingRelativeSource={RelativeSourceFindAncestor,AncestorType={x:Typecontrols:CalendarButton}},Path=Property.Ferienbeschreibung}"></TextBlock>

    </StackPanel>

    </Setter.Value>

    </MultiDataTrigger.Setters>

    </MultiDataTrigger>

    Wieder mal vielen Dank im Voraus!!!

                                                                   


    Die Taschenlampe! Die perfekte Taschenlampe für Ihr Windows Phone! - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung! - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an! [URL="http://www.windowsphone.com/de-de/store/app/die-taschenlampe/c51237fc-59fb-4a37-99db-8e72bd5657cd"]Hier gehts zur APP![/URL]

    Donnerstag, 26. Dezember 2013 18:42

Antworten

  • Hallo,

    wie geschrieben, gehöhren ToolTips nicht zum selben VisualTree, wie das meiste andere. Darum funktioniert das zurück navigieren mit RelativeSource nicht.
    Wenn du die Eigenschaft aber direkt im Border setzt, dann liegt es zumindest im XAML in der richtigen Suchreihenfolge (Vereinfacht: TextBlock < StackPanel < ToolTip < Border <...). Nach dem setzen durch einen Trigger liegt der ToolTip dagegen "neben" dem Border, weswegen ab dort dort die Reihenfolge unterbrochenwird.

    Andere Eigenschaften lassen sich dagegen normal binden, weil diese in jedem Fall im selben VisualTree liegen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Flo0806 Freitag, 27. Dezember 2013 22:57
    Freitag, 27. Dezember 2013 13:23
    Moderator

Alle Antworten

  • Hallo,
    ich habe bei meinen Recherchen heraus gefunden, das der ToolTip in einem anderen VisualTree liegt als das Control selbst usw. Eine Möglichkeit besteht nun darin den DataContext auf das Control selbst zu setzen um an die Daten zu binden.

    Nachfolge ein Beispiel, wo die Content-Eigenschaft als ToolTip genutzt wird, wenn IsChecked true ist.

    <Trigger Property="IsChecked" Value="true">
        <Setter Property="DataContext" Value="{Binding RelativeSource={RelativeSource Self}}"/>
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip>
                    <TextBlock Text="{Binding Content}"/>
                </ToolTip>
            </Setter.Value>
        </Setter>
    </Trigger>
    Im ersten Setter wird der DataContext auf das Control (hier eine CheckBox) fest gelegt. Im zweiten braucht man nur noch die Eigenschaft angeben. Ich weiß nicht welche Eigenschaft du als Value nutzen willst. Je nach vorhaben musst du den DataContext vielleicht noch anders setzen. Beim binden des DataContext''s sollte es aber keine Probleme mehr geben.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 26. Dezember 2013 23:07
    Moderator
  • :-( So einfach und ich komm net drauf.... DANKE!!!!!

    Eine für mich sehr wichtige Frage noch: Wieso funtioniert das hier einwandfrei und ohne den DataContext zu setzen:

    <Border.ToolTip>
        <StackPanel>
            <TextBlock FontWeight="Bold">Ferien</TextBlock>
            <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Ferienbeschreibung}"></TextBlock>
        </StackPanel>
    </Border.ToolTip>    

    und das hier nicht??:

    <Setter Property="ToolTip">
        <Setter.Value>
            <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Feiertagsbeschreibung}"/>
        </Setter.Value>
    </Setter>

    Ich verstehe das der Tooltip sich auf einer anderen Ebene befindet. Nur wieso klappt das Binding einmal und einmal nicht? Mein Problem ist zwar dank dir gelöst, aber ich möchte verstehen wie es zu diesen kleinen Unterschieden kommt! Vielen Dank im Voraus!

    MfG


    Die Taschenlampe! Die perfekte Taschenlampe für Ihr Windows Phone! - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung! - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an! [URL="http://www.windowsphone.com/de-de/store/app/die-taschenlampe/c51237fc-59fb-4a37-99db-8e72bd5657cd"]Hier gehts zur APP![/URL]

    Freitag, 27. Dezember 2013 07:20
  • Hallo,

    wie geschrieben, gehöhren ToolTips nicht zum selben VisualTree, wie das meiste andere. Darum funktioniert das zurück navigieren mit RelativeSource nicht.
    Wenn du die Eigenschaft aber direkt im Border setzt, dann liegt es zumindest im XAML in der richtigen Suchreihenfolge (Vereinfacht: TextBlock < StackPanel < ToolTip < Border <...). Nach dem setzen durch einen Trigger liegt der ToolTip dagegen "neben" dem Border, weswegen ab dort dort die Reihenfolge unterbrochenwird.

    Andere Eigenschaften lassen sich dagegen normal binden, weil diese in jedem Fall im selben VisualTree liegen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Flo0806 Freitag, 27. Dezember 2013 22:57
    Freitag, 27. Dezember 2013 13:23
    Moderator