为什么PropertyChangedEventHandler为null?

时间:2012-01-21 16:13:15

标签: c# binding silverlight-4.0 inotifypropertychanged

主页:

MainPage.xaml中

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

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

一个班级

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;始终为空?

2 个答案:

答案 0 :(得分:2)

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

编辑:发布您的更新。

当程序员创建Model / ViewModel的“两个”实例时,我一般都会遇到这种问题。当您使用View附加一个实例时,它总是另一个获得更新的实例(其中一个实例将具有null PropertyChanged订阅者)。因此,您必须确保您的视图使用与在其他部分更新的相同实例。 希望我的观点很清楚。

答案 1 :(得分:1)

你的代码错了,

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#6开始,请使用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