我有以下 XAML,它使用类 CurrencyImg 属性在运行时查找静态资源,因为树视图中有很多这样的资源,我不想加载相同的图像 1000 次,我保留它一个资源字典,所以它只加载一次。
<Image Name="imgCurrency" Grid.Column="5" Margin="0,0,0,0" Source="{w:ImageStaticResource {Binding CurrencyImg}}" Height="22" VerticalAlignment="Top"/>
使用示例资源字典条目作为
<ImageSource x:Key="..\Resources\Images\USD.ico">../Resources/Images/USD.ico</ImageSource>
楼盘如下
public string CurrencyImg
{
get
{
if (DisplayUSDRate)
{
return AppString.General.ImagePath + AppString.CurrencyId.USD + ".ico";
}
else
{
return AppString.General.ImagePath + curr + ".ico";
}
}
}
以及完成工作的财产行动
public override bool DisplayUSDRate
{
get { return _customer.DisplayUSDRate; }
set
{
_customer.DisplayUSDRate = value;
OnPropertyChanged("CurrencyImg");
}
}
现在,当它运行时, OnPropertyChanged("CurrencyImg") 什么都不做,原因很清楚。在 XAML 中,我没有直接绑定到 CurrencyImg 属性,而是将其用作我的 StaticResourceExtension 类的参数,因此当我调用 OnPropertyChanged 时,它认为没有要更新的绑定属性,因此 XAML 图像不会更新. 我可以理解这一点,但显然这对我没有帮助,因为我需要发生的事情如下。
1) 让类确定为该行显示哪个货币图像 2) 让图像来自资源字典,这样它们就不会被多次加载或性能受到严重影响 3) 对 DisplayUSDRate 属性的更改为通过将标志更新为适当的图像来反映。这是我无法弄清楚如何处理我的 StaticResourceExtension 的一点(代码如下)
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace Citi.Rbcs.UI.Windows
{
public class ImageStaticResource : StaticResourceExtension
{
public Binding Binding { get; set; }
private static readonly DependencyProperty DummyProperty;
public ImageStaticResource()
{
}
public ImageStaticResource(Binding binding)
{
Binding = binding;
}
static ImageStaticResource()
{
DummyProperty = DependencyProperty.RegisterAttached(
"Dummy",
typeof (Object),
typeof (DependencyObject),
new UIPropertyMetadata(null));
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var targetObject = (FrameworkElement)target.TargetObject;
Binding.Source = targetObject.DataContext;
var DummyDO = new DependencyObject();
BindingOperations.SetBinding(DummyDO, DummyProperty, Binding);
ResourceKey = DummyDO.GetValue(DummyProperty);
var resourceDictionary = new ResourceDictionary
{
Source = new Uri("pack://application:,,,/Windows/Images.xaml")
};
var key = (string) ResourceKey;
if (!resourceDictionary.Contains(key)) ResourceKey = "Default";
return base.ProvideValue(serviceProvider);
}
}
}