我有一些实现 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);
答案 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");
}
}
}