Почему привязка данных к DynamicResource не работает? - PullRequest
5 голосов
/ 17 сентября 2010

Следующий код не работает.Как мне заставить это работать?

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

Ответы [ 5 ]

5 голосов
/ 17 сентября 2010

Это неправильное использование DynamicResource MarkupExtension . Правильно было бы:

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

Предполагается, что у вас есть ресурс с ключом "VM.ImageKey", определенным где-то так:

<Bla.Resources>
    <BitmapImage x:Key="VM.ImageKey" UriSource="C:\Uri\To\Image.jpg" />
</Bla.Resources>

Однако, если вы хотите связать какое-либо свойство с текущей DataContext, вы не должны использовать DynamicResource, а Binding:

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

Предполагая, что ваш текущий DataContext является экземпляром, который имеет свойство с именем VM , которое снова имеет свойство с именем ImageKey , которое является производным типом ImageSource .

3 голосов
/ 18 сентября 2012

Не может работать, так как DyamicResource является MarkupExtension , а не свойством зависимости .Привязка данных только работает со свойствами зависимости.

Однако существует полугладкий обходной путь.Создайте класс DynamicTextBlock, который расширяет TextBlock .

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"/>

Код позади:

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();
    }
}

Использование:

  <local:DynamicTextBlock TextKey="{Binding TextKeyProperty}" />

Затем TextKeyProperty возвращает ключ, который можно найти в ResourceDictionary.Тот же подход можно использовать для Image и его свойства Source.

3 голосов
/ 20 октября 2010

Это поведение является намеренным. Привязка работает только со свойствами зависимости объектов зависимости, а MarkupExtension не является объектом зависимости.

0 голосов
/ 18 октября 2016

Я предполагаю, что в этом случае VM.ImageKey относится к свойству источника данных, значение которого вы хотите использовать в качестве ключа словаря ресурсов. Идея заключается в том, что ваш источник данных может определить, какое изображение используется, путем предоставления ключа ресурса. (Большинство других ответов на этой странице бесполезны, потому что они, к сожалению, пропустили то, что вы пытаетесь сделать, предположим, что вы хотите использовать буквенный текст "VM.ImageKey" в качестве ключа ресурса, что, я уверен, не так ' т, что вы просите.)

Кажется, это не поддерживается, но есть другой подход, который может позволить вам выбрать ресурс изображения с помощью ключа, определяемого привязкой данных: https://stackoverflow.com/a/20566945/497397

0 голосов
/ 18 сентября 2010

Если вы хотите указать ключ ресурса динамически, вы должны указать его, используя расширение разметки ResourceKey - однако вы не уверены, поддерживает ли он привязки так, как вы этого хотите. Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...