以下代碼不起作用。我如何使它工作?爲什麼數據綁定到DynamicResource不起作用?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
以下代碼不起作用。我如何使它工作?爲什麼數據綁定到DynamicResource不起作用?
<Image Source="{DynamicResource {Binding VM.ImageKey}}" />
此行爲是設計使然。綁定僅適用於依賴項對象的依賴項屬性,而MarkupExtension不是依賴項對象。
這是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
是具有AP一個實例roperty叫VM至此再次有一個屬性,稱爲ImageKey這是一個派生類型ImageSource。
如果要動態指定資源鍵,則應使用ResourceKey標記擴展名指定它 - 但不確定它是否支持您希望的綁定方式。有關更多詳細信息,請參閱here。
它不能工作,因爲DyamicResource是MarkupExtension而不是dependency property。數據綁定只有適用於依賴屬性。
但是,有一個半平滑的解決方法。創建一個擴展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屬性可以採用相同的方法。
我假設在這種情況下,VM.ImageKey
引用了您希望用作資源字典密鑰的數據源的屬性。這個想法是,您的數據源可以通過提供資源密鑰來確定使用哪個圖像。 (這個頁面上的其他大部分答案都是無用的,因爲他們不幸錯過了你想要做的事情,假設你想使用字面文本"VM.ImageKey"
作爲資源鍵,我很確定這不是什麼你在問。)
這似乎並不支持,但還有另一種方法,可以使您通過數據綁定確定鍵,選擇一個圖像資源:https://stackoverflow.com/a/20566945/497397
另外,如果ImageKey是一個靜態字段或屬性上VM類,您可以使用{x:Static}語法來檢索它: 其中lcl是爲虛擬機定義的xmlns clr-命名空間。 –
2010-09-17 20:07:59