Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InotifyProperty更改为不做任何事情_C#_Wpf_Mvvm_Data Binding - Fatal编程技术网

C# InotifyProperty更改为不做任何事情

C# InotifyProperty更改为不做任何事情,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,我现在拥有的是一个扩展的WPF工具包颜色选择器。在颜色选择器中选择颜色时,边框的颜色将更改为所选颜色。现在可以使用,请参见以下gif: 有几件事不对。当我删除INotifyPropertyChanged接口和OnPropertyChanged方法时,一切仍然正常,为什么?!不应该,对吧 此外,当我在MyStyle类中BackgroundColor属性的setter处添加断点时,该属性不会得到更新。它应该更新,因为我用以下行绑定它:b.Path=newpropertypathnameofBackg

我现在拥有的是一个扩展的WPF工具包颜色选择器。在颜色选择器中选择颜色时,边框的颜色将更改为所选颜色。现在可以使用,请参见以下gif:

有几件事不对。当我删除INotifyPropertyChanged接口和OnPropertyChanged方法时,一切仍然正常,为什么?!不应该,对吧

此外,当我在MyStyle类中BackgroundColor属性的setter处添加断点时,该属性不会得到更新。它应该更新,因为我用以下行绑定它:b.Path=newpropertypathnameofBackgroundColor

我的问题是:

当我删除所有INotifyPropertyChanged内容时,为什么这一切仍然有效 为什么当我更改颜色时,对象的BackgroundColor属性没有更新?为什么它没有到达setter断点 我有以下ViewModel:

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; }

  .....
}