DependencyProperty没有触发

时间:2012-11-02 11:23:20

标签: wpf dependency-properties

我有以下XAML使用CurrencyImg类属性在运行时查找静态资源,因为树视图中有很多这些,我不想加载相同的图像1000次,我将它保存在resourcedictionary中,因此只加载一次。

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

1 个答案:

答案 0 :(得分:1)

您可以编写一个非常简单的binding converter,将图像URI字符串转换为缓存的ImageSource对象:

public class StringToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var imageUrl = value as string;
        var image = MemoryCache.Default.Get(imageUrl) as ImageSource;

        if (image == null)
        {
            image = new BitmapImage(new Uri(imageUrl));
            MemoryCache.Default.Set(imageUrl, image, new CacheItemPolicy());
        }

        return image;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}