2010-09-17 20 views

Respuesta

4

Este comportamiento es por diseño. La vinculación solo funciona en las propiedades de dependencia de los objetos de dependencia y MarkupExtension no es un objeto de dependencia.

5

Este es un uso incorrecto de DynamicResource MarkupExtension. Corregirlo sería:

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

Asumiendo que tiene un recurso con una llave "VM.ImageKey" define un sitio como este:

<Bla.Resources> 
    <BitmapImage x:Key="VM.ImageKey" UriSource="C:\Uri\To\Image.jpg" /> 
</Bla.Resources> 

Sin embargo, si desea enlazar contra alguna forma de propiedad la corriente DataContext no debe utilizar DynamicResource pero Binding:

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

Asumiendo que su actual DataContext es una instancia que tiene ap roperty llamó VM que de nuevo tiene una propiedad llamada ImageKey que es un tipo derivado de ImageSource.

+0

Además, si ImageKey es un campo estático o la propiedad en una Clase VM, puede usar la sintaxis {x: Static} para recuperarla: donde lcl es el xmlns definido para la VM clr- espacio de nombres –

0

Si desea especificar la clave de recursos dinámicamente, debe especificarla utilizando la extensión de marcado ResourceKey; sin embargo, no está seguro de si admite enlaces en la forma que desee. Vea here para más detalles.

3

No puede funcionar ya que DyamicResource es MarkupExtension y no dependency property. La unión de datos solo funciona con propiedades de dependencia.

Sin embargo, hay una solución semi lisa. Cree una clase DynamicTextBlock que amplíe TextBlock.

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

El código subyacente:

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(); 
    } 
} 

Uso:

<local:DynamicTextBlock TextKey="{Binding TextKeyProperty}" /> 

El TextKeyProperty entonces devuelve una clave que se puede encontrar en el ResourceDictionary. El mismo enfoque se puede tomar para una Imagen y su propiedad Fuente.

0

Supongo que en este caso, VM.ImageKey se refiere a una propiedad en una fuente de datos cuyo valor desea utilizar como clave del diccionario de recursos. La idea es que su fuente de datos pueda determinar qué imagen se utiliza al proporcionar una clave de recursos. (La mayoría de las otras respuestas en esta página son inútiles, porque desafortunadamente fallaron en lo que estás tratando de hacer, suponiendo que quieres usar el texto literal "VM.ImageKey" como clave de recursos, que estoy bastante seguro de que no es lo que estás pidiendo)

no parece que esto sea apoyado, pero no hay otro enfoque que puede permitirle seleccionar un recurso de imagen a través de una clave determinada por el enlace de datos: https://stackoverflow.com/a/20566945/497397

Cuestiones relacionadas