C# 为什么iNotifyProperty发生更改';s事件属性ChangedEventHandler是否始终为空?

C# 为什么iNotifyProperty发生更改';s事件属性ChangedEventHandler是否始终为空?,c#,wpf,inotifypropertychanged,C#,Wpf,Inotifypropertychanged,这是我的示例代码,为什么PropertyChangedEventHandler属性为空? 列表绑定到应该订阅事件的Listbox。不是吗 public class Data<T> : INotifyPropertyChanged where T : class { T _data; public T MyData { get { return _data; } set { _d

这是我的示例代码,为什么PropertyChangedEventHandler属性为空?
列表绑定到应该订阅事件的Listbox。不是吗

public class Data<T> : INotifyPropertyChanged where T : class
{
     T _data;

     public T MyData
     {
        get { return _data; }
        set 
        { 
            _data = value;
            this.OnPropertyChanged("MyData");
         }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        var h = this.PropertyChanged;
        if (h != null)
        {
           h(this, new PropertyChangedEventArgs(property));
        }
    }
 }

   class Person
   {
         public string Name { get; set; }
         public int Age { get; set; }
   }

public Window1()
{
    InitializeComponent();

    List<Data<Person>> list = new List<Data<Person>>();                   

    list.Add(new Data<Person> { MyData = new Person { Name = "Sam", Age = 21 } });
    list.Add(new Data<Person> { MyData = new Person { Name = "Tom", Age = 33 } });

    this.DataContext = list;
}
公共类数据:inotifyproperty已更改,其中T:class
{
T_数据;
公共T MyData
{
获取{return_data;}
设置
{ 
_数据=价值;
本.OnPropertyChanged(“MyData”);
}
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串属性)
{
var h=this.PropertyChanged;
如果(h!=null)
{
h(该,新财产变更发展权(财产));
}
}
}
班主任
{
公共字符串名称{get;set;}
公共整数{get;set;}
}
公共窗口1()
{
初始化组件();
列表=新列表();
添加(新数据{MyData=newperson{Name=“Sam”,年龄=21});
添加(新数据{MyData=newperson{Name=“Tom”,年龄=33});
this.DataContext=list;
}

可能是因为列表框还没有机会呈现并开始侦听更改事件

当我测试以下
属性changed
时,在
列表框1\u MouseLeftButtonDown
内的更改期间,该属性不为null

Data<Person> p;
public MainWindow()
{
    InitializeComponent();

    List<Data<Person>> list = new List<Data<Person>>();
    this.p = new Data<Person> { MyData = new Person { Name = "Sam", Age = 21 } };
    list.Add(this.p);
    this.DataContext = list;
}

private void listbox1_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    p.DataContext = null;
}
datap;
公共主窗口()
{
初始化组件();
列表=新列表();
this.p=newdata{MyData=newperson{Name=“Sam”,Age=21};
列表.添加(本.p);
this.DataContext=list;
}
私有无效列表框1u MouseLeftButtonDown(对象发送器,System.Windows.Input.MouseButtonEventArgs e)
{
p、 DataContext=null;
}

可能是因为列表框还没有机会呈现并开始侦听更改事件

当我测试以下
属性changed
时,在
列表框1\u MouseLeftButtonDown
内的更改期间,该属性不为null

Data<Person> p;
public MainWindow()
{
    InitializeComponent();

    List<Data<Person>> list = new List<Data<Person>>();
    this.p = new Data<Person> { MyData = new Person { Name = "Sam", Age = 21 } };
    list.Add(this.p);
    this.DataContext = list;
}

private void listbox1_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    p.DataContext = null;
}
datap;
公共主窗口()
{
初始化组件();
列表=新列表();
this.p=newdata{MyData=newperson{Name=“Sam”,Age=21};
列表.添加(本.p);
this.DataContext=list;
}
私有无效列表框1u MouseLeftButtonDown(对象发送器,System.Windows.Input.MouseButtonEventArgs e)
{
p、 DataContext=null;
}

在您提供的代码中,将订阅PropertyChanged事件处理程序。你为什么不这么认为

这样的更改将正确更新列表框:

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData = new Person() { Name = "Bob", Age = 12 };
List List=DataContext作为列表;
列表[0]。MyData=new Person(){Name=“Bob”,年龄=12};
请记住,您的数据类不支持单个属性上的属性通知, 因此,以下更改不会更新列表框

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData.Name = "Bob"; 
list[0].MyData.Age = 12;
List List=DataContext作为列表;
列表[0].MyData.Name=“Bob”;
列表[0].MyData.Age=12;

在您提供的代码中,将订阅PropertyChanged事件处理程序。你为什么不这么认为

这样的更改将正确更新列表框:

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData = new Person() { Name = "Bob", Age = 12 };
List List=DataContext作为列表;
列表[0]。MyData=new Person(){Name=“Bob”,年龄=12};
请记住,您的数据类不支持单个属性上的属性通知, 因此,以下更改不会更新列表框

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData.Name = "Bob"; 
list[0].MyData.Age = 12;
List List=DataContext作为列表;
列表[0].MyData.Name=“Bob”;
列表[0].MyData.Age=12;

我不明白你的答案。你是说我不能将它绑定到Window构造函数中的数据吗?@标记你可以在构造函数中绑定-事件为null的原因只是因为在检查null的时候,第一个框还没有呈现出来,所以它还没有订阅事件。也就是说,事件为空是正常的。是的,如果我把这个放在按钮的点击事件中:
personp=newperson{Name=“Andy”,Age=30};列表[0]。MyData=ppersonp=newperson{Name=“Andy”,Age=30};列表[0]。MyData=p
it works您是说列表框正在显示,但您的事件仍然为空吗?@Gabe,列表显示良好,但var h=this.PropertyChanged;是空的,为什么?如何引发事件即使在列表显示之后,属性更改仍然为空?您是说列表框正在显示,但您的事件仍然为空?@Gabe,列表显示良好,但var h=this.PropertyChanged;是空的,为什么?如何引发事件因此
PropertyChanged
即使在显示列表后仍然为空?