代码之家  ›  专栏  ›  技术社区  ›  Rohit

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

wpf
  •  5
  • Rohit  · 技术社区  · 15 年前

    以下代码不起作用。我该怎么做?

    <Image Source="{DynamicResource {Binding VM.ImageKey}}" />
    
    5 回复  |  直到 14 年前
        1
  •  5
  •   bitbonk    15 年前

    这是不正确的用法 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}" />
    

    数据上下文 是具有名为 威奇又有一个叫做 wich是 ImageSource

        2
  •  3
  •   Rohit    15 年前

    这种行为是故意的。绑定只对依赖对象的依赖属性起作用,而MarkupExtension不是依赖对象。

        3
  •  3
  •   vidstige Joe Kington    13 年前

    因为动态资源是 MarkupExtension 而不是一个 dependency property 只有 使用Dependency属性。

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

        4
  •  0
  •   Alex Paven    15 年前

    如果您想动态地指定资源键,您应该使用ResourceKey标记扩展来指定它—但是不确定它是否以您希望的方式支持绑定。看到了吗 here 更多细节。

        5
  •  0
  •   Community Mohan Dere    9 年前

    VM.ImageKey 指数据源上的属性,您希望将其值用作资源字典键。其思想是您的数据源可以通过提供资源键来确定使用哪个映像。(本页上的大多数其他答案都没有帮助,因为它们不幸地错过了您要做的事情,假设您想使用文字 "VM.ImageKey" 作为一个资源密钥,我很确定这不是你想要的。)

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