为什么PropertyChangedEventHandler为null

本文关键字:null PropertyChangedEventHandler 为什么 | 更新日期: 2023-09-27 18:21:13

主页:

主页.xaml

<Canvas x:Name="LayoutRoot" Background="White">
</Canvas>

主页.xaml.cs

List<Usol> list = new List<Usol>();
for (int i = 0; i < 10; i++)
{
    var element = new Usol();
    list.Add(element);
    Canvas.SetTop(element, i * 25);
    LayoutRoot.Children.Add(list[i]);
    }
foreach (var item in list)
{
    item.context.name = "Varken";
}

用户控制

Usol.xaml

<Grid x:Name="LayoutRoot" Background="White">
    <TextBlock Text="{Binding Name}" />
</Grid>

Usol.xaml.cs

 public Context context;
 public Usol()
 {
     InitializeComponent();
     context = new Context();
     this.DataContext = context;
 }

A级

Context.cs

public class Context : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }       
    #region Fields
    /// <summary>
    /// Field Declaration for the <see cref="Name"/>
    /// </summary>
    private string name;
    #endregion
    #region Properties
    /// <summary>
    /// Gets or Sets the Name
    /// </summary>
    public string Name
    {
        get { return name; }
        set
        {
            if (this.name != value)
            {
                this.name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    #endregion
}

情况

我创建了这个小的测试应用程序来复制我在更大的应用程序中遇到的问题。它的工作方式大致相同(不完全相同,但足够接近)。

它添加了几个自定义的用户控件,每个控件都有自己的datacontext类实例。

但是,由于PropertyChangedEventHandler为空,没有一个属性愿意自行更新。

问题

为什么public event PropertyChangedEventHandler PropertyChanged;总是空?

为什么PropertyChangedEventHandler为null

Context.cs需要实现INotifyPropertyChanged接口。你在这么做吗?

编辑:发布您的更新。

当程序员创建Model/ViewModel的"两个"实例时,我通常会遇到这种问题。当您使用View附加一个实例时,它总是另一个得到更新的实例(当然,它将有一个空的PropertyChanged订阅者)。因此,您必须确保您的视图使用的实例与在其他部分更新的实例相同。希望我的观点是明确的。

您的代码是错误的,

OnPropertyChanged("Name"); <-- should update "name" not "Name"

您正在触发一个事件,表示"名称"已更改,但属性的名称是"名称",C#和绑定区分大小写。

更改为,

#region Fields
/// <summary>
/// Field Declaration for the <see cref="name"/>
/// </summary>
private string _Name;
#endregion
#region Properties
/// <summary>
/// Gets or Sets the name
/// </summary>
public string Name
{
    get { return _Name; }
    set
    {
        if (this._Name != value)
        {
            this._Name = value;
            OnPropertyChanged("Name");
        }
    }
}
#endregion

来自病房的C#,请使用nameof()关键字。。。

#region Fields
/// <summary>
/// Field Declaration for the <see cref="name"/>
/// </summary>
private string _Name;
#endregion
#region Properties
/// <summary>
/// Gets or Sets the name
/// </summary>
public string Name
{
    get { return _Name; }
    set
    {
        if (this._Name != value)
        {
            this._Name = value;
            OnPropertyChanged(nameof(Name));
        }
    }
}
#endregion