Следующий код не работает. Как мне заставить работать?Почему привязка данных к DynamicResource не работает?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
Следующий код не работает. Как мне заставить работать?Почему привязка данных к DynamicResource не работает?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
Это поведение по дизайну. Связывание работает только с зависимыми свойствами объектов зависимостей, а MarkupExtension не является объектом зависимостей.
Это неправильное использование 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
является экземпляром, который имеет ар roperty под названием VM, который снова имеет свойство под названием ImageKey, которое является производным типом ImageSource.
Если вы хотите указать ключ ресурса динамически, вы должны указать его с помощью расширения разметки ResourceKey - не уверены, поддерживает ли он привязки так, как вы этого хотите. См. here для более подробной информации.
Он не может работать, поскольку DyamicResource является MarkupExtension, а не dependency property. Databinding только работает с зависимыми свойствами.
Однако есть полугладкое обходное решение. Создайте класс 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.
Я предполагаю, что в этом случае VM.ImageKey
ссылается на свойство источника данных, значение которого вы хотите использовать в качестве ключа словаря ресурса. Идея состоит в том, что ваш источник данных может определить, какое изображение используется, поставляя ключ ресурса. (Большинство других ответов на этой странице бесполезны, потому что они, к сожалению, пропустили то, что вы пытаетесь сделать, предположите, что вы хотите использовать литеральный текст "VM.ImageKey"
в качестве ключа ресурса, который, я уверен, не является тем, что вы просите.)
Это, кажется, не поддерживается, но есть и другой подход, который может позволить вам выбрать ресурс изображения с помощью ключа, определенного привязка данных: https://stackoverflow.com/a/20566945/497397
Кроме того, если ImageKey статического поля или свойства на VM, вы можете использовать синтаксис {x: Static} для его получения: <Источник изображения = "{DynamicResource {x: Static lcl: VM.ImageKey}" /> где lcl - это xmlns, определенные для VM clr- Пространство имен. –