2010-09-17 18 views

Odpowiedz

4

To zachowanie jest zgodne z projektem. Powiązanie działa tylko na zależnościach właściwości obiektów zależności i MarkupExtension nie jest obiektem zależności.

5

Jest to nieprawidłowe korzystanie z DynamicResource MarkupExtension. Skorygować byłoby:

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

Zakładając, że zasób z klucza „VM.ImageKey” zdefiniowanej gdzieś tak:

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

Jednak jeśli chcesz związać przeciwko jakiejś formy własności obecny DataContext nie wolno używać DynamicResource ale Binding:

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

Zakładając aktualna DataContext jest instancją, która ma ap roperty o nazwie VM który ponownie ma właściwość o nazwie ImageKey, która jest pochodną typu ImageSource.

+0

Ponadto, jeśli ImageKey jest statycznym polem lub nieruchomość na zasadzie VM class, możesz użyć składni {x: Static}, aby ją pobrać: gdzie lcl to xmlns zdefiniowane dla klonu VM przestrzeń nazw. –

0

Jeśli chcesz określić klucz zasobu w sposób dynamiczny, powinieneś go określić przy użyciu rozszerzenia znaczników ResourceKey - nie wiesz, czy obsługuje on wiązania w taki sposób, jak chcesz. Aby uzyskać więcej informacji, patrz here.

3

Nie może działać, ponieważ DyamicResource to MarkupExtension, a nie dependency property. Databinding tylko działa z właściwościami zależności.

Istnieje jednak półpłynne rozwiązanie. Utwórz klasę DynamicTextBlock, która rozszerza 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"/> 

związanym kodzie:

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

Zastosowanie:

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

TextKeyProperty następnie zwraca klucz, który można znaleźć w ResourceDictionary. To samo podejście można zastosować dla właściwości Obraz i jej źródła.

0

Zakładam, że w tym przypadku VM.ImageKey odnosi się do właściwości źródła danych, którego wartość chcesz użyć jako klucza słownika zasobów. Chodzi o to, że Twoje źródło danych może określić, który obraz jest używany, dostarczając klucz zasobów. (Większość innych odpowiedzi na tej stronie jest mało pomocna, ponieważ niestety nie dotarły do ​​tego, co próbujesz zrobić, zakładaj, że chcesz używać literalnego tekstu "VM.ImageKey" jako klucza zasobów, co do którego jestem pewien, nie jest tym, co o które prosisz.)

To nie wydaje się być obsługiwane, ale nie ma innego podejścia, które mogą umożliwić Ci wybrać źródło obrazu za pomocą klucza ustalonego przez wiązania z danymi: https://stackoverflow.com/a/20566945/497397

Powiązane problemy