5 Stimmen

Warum funktioniert die Datenbindung an DynamicResource nicht?

Der folgende Code funktioniert nicht. Wie kann ich ihn zum Funktionieren bringen?

<Image Source="{DynamicResource {Binding VM.ImageKey}}" />

5voto

bitbonk Punkte 47246

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 .

3voto

Rohit Punkte 3530

Dieses Verhalten ist gewollt. Die Bindung funktioniert nur bei Abhängigkeitseigenschaften von Abhängigkeitsobjekten und MarkupExtension ist kein Abhängigkeitsobjekt.

3voto

vidstige Punkte 11788

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.

0voto

Alex Paven Punkte 5507

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.

0voto

Ian Griffiths Punkte 13712

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.com

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.

Powered by:

X