Laden...

Binding an sich selbst

Erstellt von Felsen vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.645 Views
Felsen Themenstarter:in
53 Beiträge seit 2009
vor 14 Jahren
Binding an sich selbst

Hallo,
ich habe mal wieder ein verzwicktes Problem bei dem ich einfach nicht weiterkomme. Ich habe in XAML ein DataTemplate erstellt. In einer der untergeordneten Elemente möchte ich ein Binding setzen. Da diese Binding jedoch sehr allgemein gehalten ist, muss ich dem Binding über den ConverterParameter unbedingt noch Infos mitgeben. Die dazu nötigen Informationen befinden sich allesamt in dem Element, auf das aktuell das Template angewendet wird. Deswegen wollte ich das ganze Element irgendwie in den Parameter packen, um es dann im Converter nach belieben auslesen zu können. Hier mal mein XAML:


    <DataTemplate DataType="{x:Type local:Klasse}">
        <Border Margin="10" CornerRadius="10" x:Name="bord" BorderBrush="Black" BorderThickness="2">
            <Border.RenderTransform>
                <ScaleTransform ScaleX="{Binding ElementName=sli, Path=Value}" ScaleY="{Binding ElementName=sli, Path=Value}">
                    <ScaleTransform.CenterX>
                        <Binding ElementName="Can" Path="ActualWidth" ConverterParameter="self">
                            <Binding.Converter>
                                <local:MeinConverter></local:MeinConverter>
                            </Binding.Converter>
                        </Binding>

... was ich hier provisorisch als "self" bezeichnet habe müsste das Objekt sein, auf das das Binding angewendet wird. Da sich dieses Element auch im DataContext befindet, dachte ich mir, würde folgende Schreibweise zum Ziel führen :

ConverterParameter="{Binding}"

Leider hat das aber nur zu einer Fehlermeldung geführt 😃

Würde mich über ein paar Denkanstöße freuen.

Mfg
Philipp

582 Beiträge seit 2008
vor 14 Jahren

Selbe Problem hatte ich auch. Scheinbar gibt es keine möglichkeit die Parameter entsprechen so zu erweitern, das sie das aktuelle Object mit gibt. Daher wirst du wohl auf mehrere Parameter angewiesen sein.

Gruß dat Tala

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo Felsen,

da es sich ja auch im DataContext befindet brauchst du das Element ja nicht an sich selbst binden.
Du gibst einfach beim ConverterParameter die Dinge mit die du brauchst.

Leider hat das aber nur zu einer Fehlermeldung geführt 😃

Könntest du vielleicht noch sagen welche =)

Gruss
Michael

Felsen Themenstarter:in
53 Beiträge seit 2009
vor 14 Jahren

Hallo,
die Fehlermeldung ist folgende:

"Binding" kann nicht für die Eigenschaft "ConverterParameter" vom Typ "Binding" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden.

Könntest du etwas präziser werden, wie ich mehrere Parameter in XAML übergeben kann? Im meinem Fall sieht es konkret so aus, dass das Template für ein ItemsControl gilt, welches sich in einem Canvas befinden. Der Converter braucht dazu die Information wie weit das ItemsControl von oberen und linken Rand des Canvas entfernt ist, also praktisch die Werte die Canvas.GetLeft(ItemsControl) und Canvas.GetTop(Itemscontrol) zurückgeben würden. Nur das wollte ich eben selbst im Converter machen.

Mfg
Philipp

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo,

hm die Fehlermeldung sagt eigentlich alles.
Man kann einfach kein Binding auf ConverterParamter machen weil es kein DependencyProperty ist.

Du könntest es aber über Umwege lösen.
Erster Lösungsvorschlag:
Falls du nur Daten aus einem Objekt brauchst dann binde einfach das ganze Objekt an deine Eigenschaft, dann kannst du im Converter das Objekt zerlegen und machen was du willst.

Wenn die ConverterParameter von einem anderen Objekt stammen dann wird es schon etwas schwieriger. Du könntest das Objekt das du brauchst in den Ressourcen anlegen und dann einfach dieses als StaticResource verwenden. Da bekommst du aber ein Problem wenn du mehrere verschiedene Objekte brauchst.

Eine andere Option ist dass du einfach in deiner Klasse eine Variable anlegst und dann aus dem Converter daraus zugreifst. Dadurch entsteht aber eine gewaltige Koppelung zwischen dem Converter und dem Window. Also das was man eigentlich vermeiden sollte.

Die nächste Weg würde über das MultiBinding führen. Aber ob du damit an das Ziel kommst kann ich dir auch nicht versprechen.

Du siehst schon dass es da keine wirklich gute / saubere Lösung gibt.
Am Besten ist wohl wenn du die Datenstruktur so anpasst dass du dir diesen Converter sparen (oder kein ConverterParamter-Binding) brauchst.

Hier mal ein Thread dazu: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/88a22766-5e6f-4a16-98a6-1ab39877dd09
Steht eigentlich so ziemlich das selbe was ich da gerade geschrieben habe =)

Gruss
Michael

446 Beiträge seit 2004
vor 14 Jahren

Hallo,

wie michgl geschrieben hat (bzw. was auch die Fehlermeldung sagt), kann man beim ConverterParameter kein Binding setzen.

Am einfachsten kannst du dieses Problem lösen, wenn du ein Converter schreibst der von IMultiValueConverter (hab das Interface aus dem Kopf) abgeleitet ist.

Beim MultiBinding gibts du dann, dass was du eigentlich im ConverterParameter schreiben wolltest, mit an.

Beispiel siehe hier.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp