INotifyPropertyChanged不会更新Value Converter

时间:2011-01-30 19:36:03

标签: wpf binding inotifypropertychanged ivalueconverter

我有一些实现 INotifyPropertyChanged 界面的属性。它工作正常。但在我的代码中我也使用了一些值转换器(如果值<3 - 使网格变为红色,如果值> 3且值<10 - 制作网格蓝色等)。

问题是如何在 PropertyChanged 被引发后刷新值转换器? 解决方案背后有简单的代码吗? 谢谢大家,抱歉我的英语不好!

这里有一些代码:

public class NotifyColors : INotifyPropertyChanged
{
    private Color _TodayColor;
    public Color TodayColor
    {
        get
        {
            return _TodayColor;
        }
        set
        {
            if (_TodayColor != value)
            {
                _TodayColor = value;
                OnPropertyChanged("TodayColor");
            }
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
            // it raised correctly when I change color with color picker control
        }
    }
}

// here is value converter
[ValueConversion(typeof(object), typeof(Brush))]
public class PositionToBackgroundConverter : IValueConverter
{
    ModulePreferences ModulePrefs;
    public PositionToBackgroundConverter(ModulePreferences ModulePrefs)
    {
        this.ModulePrefs = ModulePrefs;
    }

    #region IValueConverter Member

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (ModulePrefs.UseColoringByPosition)
        {
            try
            {
                if (value != null)
                {
                    short value_short = (short)value;
                    if (value_short <= 3)
                        return (Brush)new SolidColorBrush(ModulePrefs.NotifyColorsObj._TodayColor); // here is changing property
                    else
                        return (Brush)new SolidColorBrush(ModulePrefs.NotifyColorsObj.T100PlusColor);
                }
                else
                    return Brushes.Transparent;
            }
            catch
            {
                return Brushes.Transparent;
            }
        }
        else
            return Brushes.Transparent;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    #endregion
}

在这里,我将我的值转换器应用于网格:

// assign backgroundconverter
var grid = new FrameworkElementFactory(typeof(Grid));
bin = new Binding();
bin.Path = new PropertyPath(string.Format("DataItem.{0}", LastPositionColumnName));
bin.Converter = new PositionToBackgroundConverter(ProjectViewObj.ModulePrefs);
grid.SetValue(Grid.BackgroundProperty, bin);

1 个答案:

答案 0 :(得分:4)

如果您已“正确”完成,PropertyChanged事件将导致更新绑定到该属性的绑定,当发生这种情况时,使用相同的绑定将重新转换价值观。通常情况下,转换是自己发生的。如果不是这种情况,你可能会“不恰当地”使用转换器,请发布一些代码,因为如果没有它,就很难说出你究竟做错了什么。

修改:您使用grid.SetValue(Grid.BackgroundProperty, bin),您应该使用grid.SetBinding(Grid.BackgroundProperty, bin),因为它是绑定。

Edit2:这与转换器无关 在您的示例代码中,您绑定到IntValue,然后您更改TodayColor并期望更新绑定,不会发生。如果您希望绑定对两个属性做出反应,则必须使用MultiBinding或引发相应的事件,因为您的属性是相互依赖的。

    private Color _TodayColor;
    public short _IntValue;

    public short IntValue
    {
        get { return _IntValue; }
        set
        {
            if (_IntValue != value)
            {
                _IntValue = value;
                OnPropertyChanged("IntValue");
                OnPropertyChanged("TodayColor");
            }
        }
    }

    public Color TodayColor
    {
        get { return _TodayColor; }
        set
        {
            if (_TodayColor != value)
            {
                _TodayColor = value;
                OnPropertyChanged("TodayColor");
                OnPropertyChanged("IntValue");
            }
        }
    }