2009-05-28 11 views
2

何らかの理由で私はこれで本当に苦労しています。私はwpfの新人です。私はこの単純な問題を理解するために必要な情報を見つけることができません。データバインディングが更新されないようです

私はテキストボックスを文字列にバインドしようとしていますが、プログラムアクティビティの出力です。文字列のプロパティを作成しましたが、プロパティが変更されてもテキストボックスは変更されません。私はリストビューでこの問題を抱えていましたが、リストビューをリフレッシュするディスパッチャを作成しました。

wpfを使用する利点の1つは、手動でコントロールを更新する必要がないと考えたからです。誰かが私を正しい方向に送ることができることを願っています。 windowMain.xaml

x:Name="wndowMain" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
DataContext="{Binding RelativeSource={RelativeSource Self}}" 

<TextBox Name="txtDebug" Text="{Binding ElementName=wndowMain, Path=debugLog}" /> 

答えて

5

でwindowMain.xaml.cs

private string debugLogText = "initial value"; 

public String debugLog { 
    get { return debugLogText; } 
    set { debugLogText = value; } 
} 

は、あなたのクラスにINotifyPropertyChangedのを実装します。このインターフェイスが必要なクラスがたくさんある場合は、次のような基本クラスを使用すると便利です。

public abstract class ObservableObject : INotifyPropertyChanged 
{ 

    protected ObservableObject() 
    { 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) { 
      handler(this, e); 
     } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

} 

次に、プロパティ値が変更されるたびにPropertyChangedイベントが発生するようにしてください。例:

public class Person : ObservableObject { 

    private string name; 

    public string Name { 
     get { 
       return name; 
     } 
     set { 
       if (value != name) { 
        name = value; 
        OnPropertyChanged("Name"); 
       } 
     } 
    } 

} 
+1

ObservableObjectクラスの場合+1! –

+0

なぜvar handler = PropertyChanged;でこの余分な作業スレッドの安全性? –

+0

それはちょうど私が拾った習慣です。別のスレッドからこれを募集したり購読したりすることはほとんどありませんが、そこにはあまり害はなく、それは反射的なものになってしまいます。 他の人は、以下のようなイベントを初期化することでチェックを排除できることを示しています。 publicイベントPropertyChangedEventHandler PropertyChangedEventHandler PropertyChanged = delegate {}; しかし、それは遅くなるだけでなく、ハッキングしたように感じます。 :) – Josh