【问题标题】:INotifyPropertyChanged does not update Value ConverterINotifyPropertyChanged 不更新值转换器
【发布时间】:2011-06-18 05:11:58
【问题描述】:

我有一些属性实现了 INotifyPropertyChanged 接口。它工作正常。但在我的代码中,我还使用了一些值转换器(如果值 3 且值

问题是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);

【问题讨论】:

  • 发布一些代码、显示您的值转换器、显示 XAML 绑定以及引发属性的代码可能会有所帮助。
  • 正确引发了属性更改事件(我可以通过断点看到它)。
  • 我敢打赌,当您在调试器中运行此程序时,输出窗口中会显示绑定错误。如果您查看这些错误并仔细阅读它们,它们会告诉您绑定试图做什么,这几乎肯定与您认为的不一样。

标签: wpf binding inotifypropertychanged ivalueconverter


【解决方案1】:

如果您“正确”完成了操作,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");
            }
        }
    }

【讨论】:

  • 您应该进一步指定不更新的内容。我还在答案中添加了一些可能相关的内容。
  • grid.SetBinding(Grid.BackgroundProperty, bin) - 不,它对我没有帮助 :( >> 您应该进一步指定不更新的内容。当我使用颜色选择器更改颜色时,它会引发更改事件,但是我的网格背景没有更新。也许我必须为网格设置一些DataContex?
  • 好吧,你的绑定当然需要某种来源,无论是直接在绑定中指定源还是应该使用 DataContext 都取决于你。首先,您应该确保绑定完全有效,因为如果它不起作用,那么它也不会得到更新也就不足为奇了。那么你能确认它在第一次应用时有效吗?
  • 当我在另一个带有 xaml 代码的项目中使用动态颜色时,我使用了一些技巧 。也许在这里我也必须使用solidcolorbrush?为了测试我的绑定,我尝试将它绑定到另一个静态面板,它正确地改变了背景。
  • 如果你能将它绑定到另一个控件是没有用的,毕竟这不是你想要的。确保它适用于该网格。
猜你喜欢
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多