为什么数据绑定到DynamicResource不起作用?

时间:2010-09-17 07:44:34

标签: wpf

以下代码不起作用。我如何使它工作?

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

5 个答案:

答案 0 :(得分: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的某些属性绑定,则不得使用DynamicResourceBinding

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

假设您当前的DataContext是一个具有名为 VM 的属性的实例,它还有一个名为 ImageKey 的属性,它的派生类型为{{3} }}

答案 1 :(得分:3)

此行为是设计使然。绑定仅适用于依赖项对象的依赖项属性,而MarkupExtension不是依赖项对象。

答案 2 :(得分:3)

由于DyamicResource是MarkupExtension而不是dependency property,因此无法正常工作。数据绑定与dependendcy属性一起使用。

然而,有一个半流畅的解决方法。创建一个扩展TextBlock

的DynamicTextBlock类

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 :(得分:0)

如果要动态指定资源键,则应使用ResourceKey标记扩展指定它 - 但不确定它是否支持以您希望的方式绑定。有关详细信息,请参阅here

答案 4 :(得分:0)

我假设在这种情况下,VM.ImageKey引用数据源上的属性,其值要用作资源字典键。这个想法是您的数据源可以通过提供资源键来确定使用哪个图像。 (此页面上的大多数其他答案都没有用,因为他们遗憾地错过了您尝试做的事情,假设您想要使用文字文本"VM.ImageKey"作为资源键,我就是这样做的。 ;我非常肯定不是你要求的。)

这似乎不受支持,但还有另一种方法可以让您通过数据绑定确定的密钥选择图像资源:https://stackoverflow.com/a/20566945/497397