INotifyPropertyChanged не обновляет конвертер значений - PullRequest
1 голос
/ 30 января 2011

У меня есть некоторые свойства, которые реализуют интерфейс INotifyPropertyChanged .Работает нормально.Но в моем коде я также использую некоторые преобразователи значений (если значение <3 - сделать сетку красным, если значение> 3 и значение <10 - сделать сетку синим и т. Д.). </p>

Проблема заключается в том, как обновить значениеконвертер после 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 Ответ

4 голосов
/ 30 января 2011

Если вы сделали это «правильно», событие PropertyChanged вызовет обновление привязок, которые привязываются к этому свойству, при этом любые конвертеры, которые используются в той же привязке , будут преобразовывать ценности. Поэтому обычно преобразования происходят самостоятельно. Если это не тот случай, когда вы, вероятно, используете конвертеры «ненадлежащим образом», пожалуйста, опубликуйте некоторый код, потому что без него совершенно невозможно сказать, что именно вы делаете неправильно.

Редактировать: Вы используете grid.SetValue(Grid.BackgroundProperty, bin), вместо этого следует использовать grid.SetBinding(Grid.BackgroundProperty, bin), поскольку это привязка.

Edit2: Это действительно не имеет никакого отношения к конвертерам.
В вашем примере кода вы привязываетесь к IntValue, затем изменяете TodayColor и ожидаете обновления привязки, не произойдет . Если вы хотите, чтобы привязка реагировала на оба свойства, вы должны либо использовать MultiBinding, либо вызвать соответствующие события, поскольку ваши свойства взаимозависимы.

1021 * т.е. *

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