Der folgende Code funktioniert nicht. Wie kann ich ihn zum Funktionieren bringen?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
Der folgende Code funktioniert nicht. Wie kann ich ihn zum Funktionieren bringen?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
Dies ist eine falsche Verwendung des DynamicResource MarkupExtension . Richtig wäre es:
<Image Source="{DynamicResource VM.ImageKey}" />
Angenommen, Sie haben eine Ressource mit einem Schlüssel "VM.ImageKey" irgendwo wie folgt definiert:
<Bla.Resources>
<BitmapImage x:Key="VM.ImageKey" UriSource="C:\Uri\To\Image.jpg" />
</Bla.Resources>
Wenn Sie jedoch eine Bindung an eine Eigenschaft der aktuellen DataContext
dürfen Sie nicht verwenden DynamicResource
sondern Binding
:
<Image Source="{Binding VM.ImageKey}" />
Angenommen, Ihr derzeitiger DataContext
ist eine Instanz, die eine Eigenschaft namens VM die wiederum eine Eigenschaft namens ImageKey die ein abgeleiteter Typ von ImageSource .
Es kann nicht funktionieren, da die DyamicResource eine MarkupExtension und nicht ein Abhängigkeitseigenschaft . Datenbindung nur arbeitet mit abhängigen Eigenschaften.
Es gibt jedoch eine halbwegs reibungslose Umgehung. Erstellen Sie eine DynamicTextBlock-Klasse, die eine TextBlock .
Die xaml:
<TextBlock x:Class="Rebtel.Win.App.Controls.DynamicTextBlock"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"/>
Der Code dahinter:
public partial class DynamicTextBlock : TextBlock
{
public static readonly DependencyProperty TextKeyProperty = DependencyProperty.Register(
"TextKey", typeof(string), typeof(DynamicTextBlock), new PropertyMetadata(string.Empty, OnTextKeyChanged));
private static void OnTextKeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var me = ((DynamicTextBlock)d);
if (e.NewValue != null)
{
me.TextKey = (string) e.NewValue;
}
}
public string TextKey
{
set { SetResourceReference(TextProperty, value); }
}
public DynamicTextBlock()
{
InitializeComponent();
}
}
Verwendung:
<local:DynamicTextBlock TextKey="{Binding TextKeyProperty}" />
Die TextKeyProperty gibt dann einen Schlüssel zurück, der im ResourceDictionary gefunden werden kann. Derselbe Ansatz kann für ein Bild und dessen Eigenschaft Source gewählt werden.
Wenn Sie den Ressourcenschlüssel dynamisch angeben wollen, sollten Sie ihn mit der ResourceKey-Markup-Erweiterung angeben - ich bin nicht sicher, ob sie Bindungen in der von Ihnen gewünschten Weise unterstützt. Siehe aquí für weitere Einzelheiten.
In diesem Fall gehe ich davon aus, VM.ImageKey
verweist auf eine Eigenschaft einer Datenquelle, deren Wert Sie als Schlüssel des Ressourcenwörterbuchs verwenden möchten. Die Idee dahinter ist, dass Ihre Datenquelle durch die Angabe eines Ressourcenschlüssels bestimmen kann, welches Bild verwendet wird. (Die meisten anderen Antworten auf dieser Seite sind nicht hilfreich, weil sie leider nicht wissen, was Sie vorhaben, nämlich anzunehmen, dass Sie den wörtlichen Text "VM.ImageKey"
als Ressourcenschlüssel, was sicher nicht das ist, wonach Sie fragen).
Dies scheint nicht unterstützt zu werden, aber es gibt einen anderen Ansatz, der es Ihnen ermöglicht, eine Bildressource über einen durch Datenbindung bestimmten Schlüssel auszuwählen: https://stackoverflow.com/a/20566945/497397
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.