Wie kann ich angeben von Ressourcen, die in einer MVVM-view-Modell?
Angenommen, ich möchte, um zu zeigen, Liste von Objekten, wobei jedes Objekt soll einen Namen und ein passendes Bild (z.B. Einträge mit Icons oder buttons mit text und Bild).
Alle Beispiele und Programme ausgesetzt, das Bild im viewmodel als einen Pfad zu einer PNG-Datei und dann gebunden die Source
einer Image
zu. Aber was ist, wenn ich will, Vektor-Bilder (beispielsweise als DrawingImage
in einem lokalen ResourceDictionary
)? Freilegung der DrawingImage aus dem view-Modell scheint schlecht, weil ich hätte, um zu speichern einen Verweis auf die Anwendung/Fenster/Benutzer control/... (und es wird empfohlen, nicht aussetzen, solche XAML-Objekte von der view-Modelle).
Damit ein besserer Ansatz wäre die Verwendung eines string-Bezeichner in der Ansicht Modell-und irgendwie dann wählen Sie die entsprechende Ressource. Wenn dieser Bezeichner wird der Ressource-Schlüssel dieses snippet sieht verlockend, aber funktioniert nicht:
<Image Source="{StaticResource {Binding Icon}}"/>
Fand ich zwei Möglichkeiten, dass, obwohl Sie nicht für mich arbeiten.
-
Die erste war die mit einer normalen Bindung auf das Symbol mit einem Konverter, der aussah, bis die Ressource in
Application.Current
. Dies funktioniert nicht, wenn die Ressource an einem anderen Ort gespeichert ich denke (und die situation, wo ich anfangs traf dieses problem hatte keine Anwendung läuft noch, da es ein Fenster Auswahl der Anwendung zum starten!). -
Die zweite Lösung, war mit einer markup-Erweiterung abgeleitet von
StaticResourceExtension
bringen IhreResourceKey
von der übergebenen binding:<Image Source="{local:BindableStaticResource {Binding Icon}"/>
Dieser sieht wirklich ordentlich, da könnte es lokale Ressourcen nutzen, auch für andere Dinge. Aber wenn Sie es bekam ich immer eine Ausnahme ("Ressource namens {FooIcon} konnte nicht gefunden werden.", zeigt die richtige XAML-Datei und position der Erweiterung). Sogar eine leere Ressource-Erweiterung abgeleitet von
StaticResourceExtension
dass soeben die Ressource-Taste, um den Basis-Konstruktor hat nicht funktioniert, und ich kann nicht erklären, warum. Nur mitStaticResourceExtension
hat Prima funktioniert.
Irgendwelche Ideen, wie ich das Problem beheben könnte der zweite Ansatz, oder noch besser Lösungen?
Bearbeiten
Bemerkte ich, dass es hat funktionieren, wenn direkt verwendet, wie diese:
<Window>
<Window.Resources>
<DrawingImage x:Key="SomeIcon"/>
</Window.Resources>
<Image Source="{BindableStaticResource {Binding Icon}}"/>
</Window>
aber schlägt fehl, zum Beispiel in einem DataTemplate
. Obwohl eine normale StaticResourceExtension
arbeiten beide Male, also bin ich verwirrt, was ist falsch gehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Lösung, die Sie erwähnen, können hier gefunden werden: Die Bindung einer datacontext-string-Eigenschaft, um ein StaticResource-Schlüssel
Wollte ich mit der zweiten Arbeit, um die Sie erwähnen ( http://sweux.com/blogs/psampaio/index.php/2009/06/16/using-data-binding-with-static-resources-in-wpf/), aber ich habe nie habe es funktioniert. Es throwed eine ArgumentNullException-Ausnahme, da der DataContext war null. Ich denke, das hatte etwas mit der Tatsache zu tun, dass ich mit einem DataTemplate erstellen mein Ausblick aus meinem ViewModel, und irgendwie den DataContext nicht gesetzt wurde, bevor die ProvideValue-Methode aufgerufen wurde (im Beispiel auf dieser Seite, das DataContext gesetzt ist, in der .xaml.vb-Klasse).
So, ich begann, mich für einen workaround und eine gefunden, die auch mit einem converter, aber dies findet man die Ressource durch ein FrameworkElement-Methode statt stochern Anwendung.Aktuelle. Die, die ich gefunden ist hier beschrieben:
http://drwpf.com/blog/2007/08/18/can-my-value-converter-access-the-target-of-the-binding/
Werde ich so kopieren Sie die entsprechenden Informationen hier:
Geht es um ein ValueConverter Implementierung der Schnittstelle IMultiValueConverter, um Zugriff auf die Steuerung auf, welche die Bindung eingestellt ist.
Den code für die Convert-Methode ist die folgende:
Und der XAML-Code für ein content-Steuerelement würde das so Aussehen:
Und der XAML-Code für ein Bild ist das folgende:
Funktioniert wie ein Charme 😀
Da ist ein Fehler in benutzerdefinierte MarkupExtensions, die nicht erlauben, Sie zu verwenden, Sie in einem Attribut, das wie.
Problemumgehung 1: Deklarieren Sie das Attribut als ein element, etwa so:
Problemumgehung 2: Wenn Sie precompile die MarkupExtension, indem Sie es in einer anderen assembly und auf Sie verweisen, dann funktioniert es wieder. Dies könnte sein, warum Sie sehen, dass es Arbeit in der Haupt-Fenster, aber nicht in Ihrem DataTemplate.