Hallo Community,
Ich habe ein kleines Binding-Problem. Mein Problem sieht in etwa so aus:
<l:MyControl x:Name="myControl"/>
<Button>
<Button.Command>
<l:MyCommand WorkingObject="{Binding ElementName=myControl,Path=SelectedObject}"/>
</Button.Command>
</Button>
Dieses Binding funktioniert nicht da das Element myControl nicht gefunden wurde. Bindings per ElementName scheinen nur zu funktionieren wenn man sie in einem Control definiert. Wie würdet ihr dieses Szenario lösen?
Wie würdet ihr dieses Szenario lösen?
Mit einem ViewModel, das als DataContext verwendet wird und an dessen Property entsprechend gebunden wird. 😉
Hallo Lector,
ich vermute mal, dass es daran liegt, dass deine Klasse in visuellen Tree liegt. Stichwort: Freezable, Inheritance. Siehe auch: http://www.codeproject.com/KB/WPF/ArtificialInheritanceCxt.aspx.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Hallo winSharp93,
So mache ich das normalerweise auch. Das Problem ist hier dass ich kein richtiges ViewModel habe sondern nur ein Control welches ich steuern möchte. Der Command den ich verwende ist wiederverwendbar und zeigt einen FileOpenDialog an. Wenn etwas ausgewählt wurde wird der OpenCommand des Controls ausgeführt an dem die geöffnete Datei übergeben wird.
Wenn man allerdings davon ausgeht dass das Control in diesem Fall das ViewModel ist und ich den DataContext des Buttons auf des Control setze funktioniert es. Das war dann wohl ein Denkfehler meinerseits....
@zero_x
Der Artikel scheint mein Problem zu beschreiben. Ich werde ihn mit mal durchlesen. Evtl. braucht man sowas öfters. Ich hatte auch schon das Problem dass ich KeyBindings einen Command zuweisen wollte welcher in einem Control lag. Evtl. lässt sich dieser Fall auch damit lösen.
Hallo Lector,
durchlesen dient nur zum Verständnis. In dem Projekt gibt es die DataContextSpy-Klasse. Damit sollte es dann eigentlich klappen.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
So mache ich das normalerweise auch. Das Problem ist hier dass ich kein richtiges ViewModel habe sondern nur ein Control welches ich steuern möchte.
Das sollte eigentlich nicht stören.
Verwende hier einfach einen "View-First-Ansatz" (d.h. das View erzeugt das ViewModel).
Im einfachsten Fall müsstest du nur schreiben:
<UserControl ...>
<UserControl.DataContext>
<my:FooDialogViewModel />
</UserControl.DataContext>
</UserControl>