Dmi*_*riy 2 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
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将我的值转换器应用于网格:
// 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);
Run Code Online (Sandbox Code Playgroud)
如果您“正确”地完成了它,该PropertyChanged事件将导致绑定到该属性的绑定更新,当发生这种情况时,在同一绑定中使用的任何转换器都将重新转换这些值。所以通常转换会自行发生。如果不是这种情况,您可能“不恰当地”使用转换器,请发布一些代码,因为没有它就不可能知道您究竟做错了什么。
编辑:您使用grid.SetValue(Grid.BackgroundProperty, bin),您应该使用,grid.SetBinding(Grid.BackgroundProperty, bin)因为它是一个绑定。
Edit2:这真的与转换器无关。
在您绑定到的示例代码中IntValue,然后您更改TodayColor并期望更新绑定,不会发生。如果您希望绑定对这两个属性做出反应,您必须使用 aMultiBinding或引发相应的事件,因为您的属性是相互依赖的。
IE
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)