2010-09-17 2 views

ответ

4

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

5

Это неправильное использование 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.

+0

Кроме того, если ImageKey статического поля или свойства на VM, вы можете использовать синтаксис {x: Static} для его получения: <Источник изображения = "{DynamicResource {x: Static lcl: VM.ImageKey}" /> где lcl - это xmlns, определенные для VM clr- Пространство имен. –

0

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

3

Он не может работать, поскольку 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.

0

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

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

Смежные вопросы