Poniższy kod nie działa. Jak mogę to sprawić?Dlaczego powiązanie danych z DynamicResource nie działa?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
Poniższy kod nie działa. Jak mogę to sprawić?Dlaczego powiązanie danych z DynamicResource nie działa?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
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.
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.
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.
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.
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
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. –