以下代码不起作用。我如何使它工作?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
答案 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
的某些属性绑定,则不得使用DynamicResource
但Binding
:
<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