2012-01-21 102 views
0

的炫魅:为什么PropertyChangedEventHandler为空?

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类的实例。

然而,没有任何属性都愿意更新themselfs由于空PropertyChangedEventHandler

问题

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

+0

只是一个建议。您没有遵循预期的字段/属性名称约定。 –

+0

你的意思是没有人订阅?如果您使用OneTime绑定,这是我期望的行为。 。如果你没有定义接口(例如事件在那里,但类定义它),也会发生这种情况。 –

回答

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 
+0

固定错字:此应用程序中存在固定问题。然而,在我的“更大”的应用程序中,我仍然有类似的问题,我确信绑定已正确完成。需要一些时间来进一步调查我的问题 –

1

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

编辑:张贴您的更新。

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

+0

公共类上下文:INotifyPropertyChanged。是的,用适当的信息更新了问题。谢谢你指出我忘了在我的问题中加上这个。 –

+0

我在网上遇到了一些这样的答案,我理解这个问题。但我不明白的是silverlight如何能够期待2个实例。即使这样只有一个实例可以用于绑定,至少有一个PropertyChanged应该有一个值,因为所有正在创建的10个绑定到一个视图。 –

相关问题