Laden...

Databinding funktioniert nicht mehr sobald ein Template zugewiesen wurde

Erstellt von hypersurf vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.246 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 13 Jahren
Databinding funktioniert nicht mehr sobald ein Template zugewiesen wurde

Ich benutze das MVVM-Pattern und habe in meinem View mehrere Textboxen. Die Textbox die den Focus hat soll eine andere Hintergrundfarbe bekommen also die anderen Textboxen. Das funktioniert über Commands die mittels Trigger ausgelöst werden auch recht problemlos:

<TextBox>
	<i:Interaction.Triggers>
        	<i:EventTrigger EventName="GotFocus">
                	<wpf:CommandAction Command="{Binding cmdTextboxGotFocus}"/>	
		</i:EventTrigger>
                <i:EventTrigger EventName="LostFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxLostFocus}"/>	
		</i:EventTrigger>	
	</i:Interaction.Triggers>
</TextBox>

Ich möchte aber nicht bei jeder Textbox die Trigger hinterlegen, sondern würde das gerne über ein Template lösen:

    <Window.Resources>
        <ControlTemplate x:Key="myTextBox" TargetType="TextBox">
            <TextBox>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="GotFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxGotFocus}"/>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="LostFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxLostFocus}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
        </ControlTemplate>
    </Window.Resources>

Auch das funktioniert ohne Probleme, sofern ich allen Textboxen das Template zuweise. Danach funktioniert aber das Databinding nicht mehr.

                    <TextBox Grid.Column="3" Grid.Row="0" Height="20" 
                             Text="{Binding Path=Databasename}" Template="{StaticResource myTextBox}">
                    </TextBox>

Könnt Ihr mir einen Hinweis geben, warum das Binding bei zugewiesenem Template nicht mehr funktioniert? Nehme ich das Template wieder raus, funktioniert das Binding wieder einwandfrei.

Danke =)

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo hypersurf,

das Problem ist dass du in deinem Template drinnen eine neue TextBox definierst.

Damit sagst du also: "Meine TextBox hat das Aussehen von einer TextBox mit den Triggern"

Somit hast du zwei TextBoxen ineinander verschachtelt. Wenn du nun auf die TextBox bindest dann bindest du auf die äußere aber angezeigt wird nur die innere (die im Template).

Erstelle da besser einen Style wo du nur die Dinge setzt die nötig sind und nicht eine neue TextBox erstellst.

Gruß
Michael

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

genau das wollt ich auch grad schreiben:)

Aber warum überhaupt so umständlich mit den Events? Es gibt doch mit IsFocused das passende Property auf das man triggern kann.

Baka wa shinanakya naoranai.

Mein XING Profil.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo talla und michlG,

beides falsch. Er möchte mit den Interactions von Blend arbeiten. Das ist sein Problem. Klar, man kann das auch so lösen, das erfüllt aber nicht die Frage.

Das Problem ist, dass die Funktionen aus dem Blend SDK nicht built-in sind. Die wurden nachträglich veröffentlicht. Die lassen sich wunderbar in WPF integrieren. Das ist kein Problem. Man sagt dem Control, dass es dieses und jenes Verhalten annehmen soll. Was du aber haben möchtest, ist, dass in einem Style das vorhanden sein soll. Warum das jetzt nicht built-in ist, kann ich dir leider nicht sagen. Das Problem hierbei ist, dass der Setter nicht darauf zugreifen kann, weil einfach das Property der TextBox(allen Controls) fehlt. Jetzt stehen wir da und wissen nicht weiter. Und genau das ist auch dein Problem.

Schreib dir eine Helferklasse, in der die Attached Property drin sind. Über diese machst du dann einfach den Umweg. Dann sagst du, dass du über diese Klasse Behaviors füttern möchtest. Der Typ des Attached Properties ist natürlich auch von Behavior. Die OnPropertyChanged-Methode setzt dann alles richtig um. So kannst du dann in .Value sagen, was du haben möchtest.

Google mal.

zero_x

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo zero_x,

Der Grund warum das Binding nicht funktioniert ist der von michlG geschilderte, auch wenn du das verneinst. Wenn im Template statt

<TextBox>...
<TextBox Text="{TemplateBinding Text}">

stehen würde, würds auch mitm Template klappen.

Aber wie schon gesagt, Templates sind hier nicht nötig da nur ein Property gesetzt werden soll. Du hast Recht wenn du von den Behaviours redest, aber das ist nen stinknormales attached Property und die EventTrigger sind einfach nur der Wert des Properties. Sowas setzt man ganz normal durch nen Style wenn es bei mehreren TextBoxen gleich gesetzt werden soll.

Aber wie schon in meinem anderen Beitrag gesagt: Ausgehend von der Aussage

Die Textbox die den Focus hat soll eine andere Hintergrundfarbe bekommen denke ich immer noch das hier das Behaviour unnötig ist.

Baka wa shinanakya naoranai.

Mein XING Profil.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo talla,

sorry, ich habe mich verschrieben. Natürlich meinte ich nicht Depdnency Property, sondern Attached Property. Meinen Beitrag habe ich korrigiert.

zero_x

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 13 Jahren

Danke für Eure schnellen Antworten, werde mich gleich mal an die Arbeit machen 😃

Hallo zero_x,
denke ich immer noch das hier das Behaviour unnötig ist.

Da hast Du recht, aber mir geht es auch darum das Arbeiten mit den Behaviours zu lernen 😉