C# InotifyProperty更改为不做任何事情
我现在拥有的是一个扩展的WPF工具包颜色选择器。在颜色选择器中选择颜色时,边框的颜色将更改为所选颜色。现在可以使用,请参见以下gif: 有几件事不对。当我删除INotifyPropertyChanged接口和OnPropertyChanged方法时,一切仍然正常,为什么?!不应该,对吧 此外,当我在MyStyle类中BackgroundColor属性的setter处添加断点时,该属性不会得到更新。它应该更新,因为我用以下行绑定它:b.Path=newpropertypathnameofBackgroundColor 我的问题是: 当我删除所有INotifyPropertyChanged内容时,为什么这一切仍然有效 为什么当我更改颜色时,对象的BackgroundColor属性没有更新?为什么它没有到达setter断点 我有以下ViewModel:C# InotifyProperty更改为不做任何事情,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,我现在拥有的是一个扩展的WPF工具包颜色选择器。在颜色选择器中选择颜色时,边框的颜色将更改为所选颜色。现在可以使用,请参见以下gif: 有几件事不对。当我删除INotifyPropertyChanged接口和OnPropertyChanged方法时,一切仍然正常,为什么?!不应该,对吧 此外,当我在MyStyle类中BackgroundColor属性的setter处添加断点时,该属性不会得到更新。它应该更新,因为我用以下行绑定它:b.Path=newpropertypathnameofBackg
public class BoxViewModel : INotifyPropertyChanged
{
private string _backgroundcolor;
public string Description { get; set; }
public string BackgroundColor
{
get
{
return _backgroundcolor;
}
set
{
_backgroundcolor = value;
OnPropertyChanged();
}
}
/// <summary>
/// Occurs when [property changed].
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后MyStyle是一个抽象类,具有一系列属性,比如BackgroundColor:
public abstract class MyStyle
{
string _BackgroundBrush;
string _BackgroundColor;
.....
public string BorderColor
{
get { return _BorderColor; }
set
{
_BorderColor = value;
BorderColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BorderColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BorderColorBrush { get; set; }
public string BackgroundColor {
get { return _BackgroundColor; }
set {
_BackgroundColor = value;
BackgroundColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BackgroundColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BackgroundColorBrush { get; set; }
.....
}
编辑
它会更新BoxViewModel.BackgroundColor属性,并且在颜色更改时会调用这些setter和getter。MyStyle仍然没有发生任何变化。背景颜色没有改变。它是否与数据上下文或绑定属性或其他内容有关?mystyle类中的BackgroundColor字符串和BackgroundColor都应该更改 看一看
很抱歉花了这么长时间回复,实际上您遇到了WPF的另一个隐藏方面,即如果源对象是普通CLR对象且未实现INotifyPropertyChanged接口,WPF的数据绑定引擎将数据绑定到PropertyDescriptor实例,该实例将封装源属性。数据绑定引擎将尝试通过PropertyDescriptor.AddValueChanged方法订阅属性更改事件。当目标数据绑定元素更改属性值时,数据绑定引擎将调用PropertyDescriptor.SetValue方法将更改后的值传递回源属性,同时引发ValueChanged事件通知此实例中的其他订户,其他订阅者将是列表框中的文本块
如果您正在实现INotifyPropertyChanged,那么您完全有责任在需要数据绑定到UI的每个属性设置器中实现更改通知。否则,更改将不会像您预期的那样同步
希望这能把事情弄清楚一点
所以基本上你可以这样做,只要它是一个普通的CLR对象。这似乎是WPF绑定引擎的一个特性。它检测到您将多个控件绑定到数据源VM的同一实例,并且这些绑定中至少有一个处于双向模式。当绑定更新源属性时,绑定引擎会自动更新其他绑定控件,而无需任何通知 对于不是通过代码中执行的绑定更改而产生的更改,需要INotityPropertyChanged
我已经用一个简单的WPF应用程序对此进行了测试,该应用程序有两个文本框,双向绑定到POCO视图模型,没有INPC实现。更新其中一个文本框会更改另一个文本框的内容,而没有明显的通知机制 公共类框:MyStylewat@Will对不起,为了回答这个问题,我重新命名了它,但是拼写错误。抽象类样式必须是MyStyle,带有背景属性。我是绑定和WPF的新手,所以我只有一个猜测:绑定视图和类框。ViewModel类没有绑定。也许您应该在ViewModel中创建类框的实例,而不是在类框中创建ViewModel的实例!?ViewModel将管理所有。然后从Box类获取数据并从ViewModel绑定它。我希望这不是完全错误碰巧我已经使用WPF多年了,从来没有注意到这种行为。很好的发现。如果我告诉你每个框都有自己的数据源,你的答案会改变吗?我从不从一个对象中画多个框,我总是从一个对象和一个数据源中只画一个框,因为框是XML反序列化的实例否-我指的是框和相关的颜色选择器,如果我理解正确的话,对不起,我对WPF非常陌生,两周前就开始了;它在没有inotify的情况下仍然可以工作,因为我使用的是直接绑定;其次,调试器没有捕获属性更新断点,因为没有明显的通知机制。是这样吗?那么这个物体真的发生了变化吗?不过,对象确实需要更改,因为我必须将对象序列化为XML,并能够使用用户自定义的颜色将它们保存在方框中。我不知道为什么它能准确工作-RRusev的另一个答案可能解释了这一点,但我不相信,因为计时器更新不会传播到绑定的cont 在我的测试中有很多的问题。关于您的另一个问题,绑定对象的属性应该在更改-检查绑定到颜色选择器的属性,而不是另一个。
public abstract class MyStyle
{
string _BackgroundBrush;
string _BackgroundColor;
.....
public string BorderColor
{
get { return _BorderColor; }
set
{
_BorderColor = value;
BorderColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BorderColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BorderColorBrush { get; set; }
public string BackgroundColor {
get { return _BackgroundColor; }
set {
_BackgroundColor = value;
BackgroundColorBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value != null ? BackgroundColor : "#FFFFFFFF"));
}
}
public SolidColorBrush BackgroundColorBrush { get; set; }
.....
}