属性更改时不会触发INotifyPropertyChanged

时间:2018-11-13 10:27:06

标签: c# wpf

我有一个不断更新的bool值,并且INotifyPropertyChanged事件未正确触发。它到达IF部分并跳过,因为它看到传递了null。我确实在类顶部添加了System.ComponentModel

第一部分:

  public class ToolTipInortfyPropertyChange : INotifyPropertyChanged
{


    private bool form15TooltipShow;
    public bool Form15TooltipShow
    {
        get { return form15TooltipShow; }
        set
        {
            form15TooltipShow = value;
            OnPropertyChanged("Form15TooltipShow");
        }

    }

然后是第二部分,都属于同一类

 public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

当我进入代码时,它进入“设置”部分,然后跳转到OnPropertyChanged并跳过if,这样我的视图就不会因需要布尔值的另一个事件而更新

Tx

2 个答案:

答案 0 :(得分:4)

对于c#中的每个事件,都是这种情况,如果没有人订阅该事件,则它将为null。在这种情况下,似乎没有人订阅PropertyChanged事件。

PS::我建议将[CallerMemberName]属性放在OnPropertyChanged方法中,这样就不必每次都手动传递名称。像这样:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)

请注意我是如何使方法protected而不是公开的,我们不仅希望有人能够提出该事件

编辑:这是完整的OnPrertyChanged方法:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

答案 1 :(得分:0)

浏览代码时,我可以看到

  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

执行并且该值不再为null,因此必须收集一个“侦听器”。但是视图不会更新。该复选框位于一个窗体上,将从该复选框接收事件的控件位于另一窗体上。它几乎就像2个对象一样被创建,并且它们不能互相交谈,因为它们是2个不同的实体。在表1上创建类型为person的新对象时是否可能,而在表2上创建相同的对象?

我创建了一个全新的项目,并使其尽可能简单。在form1上的文本框和在form 2上的文本框,并尝试在这两个窗体之间传递文本。线

  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

执行时不带任何Null值,但视图不会更新。

这是XAML

 <TextBox Text="{Binding Path=CheckBoxState ,Mode=TwoWay}"></TextBox>

并且我尝试了各种不同的选项,例如ASYNC等。结果始终是相同的。我什至从表单中删除了后面的代码,并在XAML上进行了绑定

    <Window.Resources>
    <local:CheckBoxClass x:Key="CheckBoxFinder" />
</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource CheckBoxFinder}}">

我认为这很好用,因为在我键入PATH =后自动出现了智能  然后会弹出列出的唯一属性。

任何建议将不胜感激。 tx

好吧,只使用了完全相同的代码,只是向form1添加了另一个文本框。所以form1有2个文本框。我完全像以前一样约束它们,唯一的区别是发送和接收的控件使用相同的形式。猜猜是什么...有效。

当2个表单需要传递数据时会出现问题。就像创建了两个对象,它们无法通信。我敢肯定,这是所有经验丰富的人/女孩的常识。但是,如何在这些形式之间使用一个对象,以便它们进行同步?希望我以前知道这个可以更简洁地提出我的问题

相关问题