2012-01-21 17 views
0

メインページ:PropertyChangedEventHandlerはなぜnullですか?

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のために更新するつもりはありません。

質問はなぜ常にnull public event PropertyChangedEventHandler PropertyChanged;ある

+0

ちょっとした提案です。予想されるフィールド/プロパティ名の規則に従っていません。 –

+0

誰も購読していないということですか?これは、OneTimeバインディングを使用すると予想される動作です。 これは、インターフェースを定義していない場合(イベントは存在しますが、クラスによって定義されているなど)にも発生します。 –

答えて

1

あなたのコードは、

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

間違っているあなたは、「名」が変更されたというイベントを発射しているが、プロパティの名前は、「名前」、C#と結合される大文字と小文字を区別します。

病棟でのC#6から

#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 

、に変更し、それを、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の「2つの」インスタンスを作成すると、一般にこの種の問題が発生しました。 Viewで1つのインスタンスをアタッチしている間は、それは常に更新を取得するもう1つのインスタンスです(これは、PropertyChangedサブスクライバがnullになります)。したがって、ビューが他の部分で更新されているものと同じインスタンスを使用していることを確認する必要があります。 私の要点がはっきりしていることを願っています。

+0

パブリッククラスコンテキスト:INotifyPropertyChanged。はい、質問を適切な情報で更新しました。私が質問に追加するのを忘れていたことを指摘してくれてありがとう。 –

+0

私はネット上でこれらの回答のいくつかに出くわしました。問題を理解しています。しかし、私が理解していないのは、Silverlightが2つのインスタンスを期待できる方法です。少なくとも1つのインスタンスしかバインディングに使用できない場合でも、作成されている10個のすべてがビューにバインドされているため、PropertyChangedの少なくとも1つは値を持つ必要があります。 –

関連する問題