2011-01-18 8 views
1

これは私のシナリオです。私は標準のintプロパティを持つ内部クラスを持っています。WPFでのデータバインディングへのプロパティの公開

public class Session : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    private ushort _Level; 
    public ushort Level 
    { 
     get { return _Level; } 
    } 

    private void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    // a timer code here updates the _Level property every 60 seconds 
    // and calls OnPropertyChange("Level"); 
} 

私のUIウィンドウには、セッションインスタンスにバインドしてレベル値を表示するラベルがあります。

<TextBlock Name="LevelTextBlock" Text="{Binding SessionInstance.Level, StringFormat='0%'}" /> 

とウィンドウコンストラクタは、このコードを持っています

public MyWindow() 
    { 
     SessionInstance = new Session(); 

     this.InitializeComponent(); 
    } 

    public Session SessionInstance { get; set; } 

私は_levelの値を更新する場合ただし、あなたが推測できるように、UIは、テキストブロックを更新しません。 Sessionクラス内にDependancyPropertyを追加することは容認できません。私はウィンドウでこれを行うことができましたが、それでも値をSessionインスタンスに戻す通知機能が必要です。 これを行うエレガントな方法があるのだろうかと思っていました。私は、テキストブロックの値をチェックして更新するウィンドウ内の別のタイマーを実行する以外は何も考えることはできません。 考えていますか?

答えて

4

INotifyPropertyChangedを実装します。 toolでも、すべてのプロパティ(または属性でマークされたプロパティのみ、それはかなり構成可能です)に対して自動的に行うことができます。

他の機能(値の継承、プロパティからのバインディングなど)が不要な場合は、DependencyPropertyが過剰です。モデルプロパティではなくコントロールプロパティに最適です。

EDIT:

private string familyName; 
public string FamilyName 
{ 
    get { return familyName; } 
    set 
    { 
     if (value != familyName) 
     { 
      familyName = value; 
      OnPropertyChanged("FamilyName"); 
     } 
    } 
} 
+0

これを追加しましたが、まだ更新されていません。元のコードを編集して編集内容を表示します。 –

+0

プロパティレベルのセッターで手動でOnPropertyChangedを呼び出すか、私が書き込んだNotifyPropertyWeaverを使用する必要があります(正しく実行されていることを確認してください。ビルド出力ログに数行追加されます)。 –

+0

データコンテキストをどこに設定しているのかわかりません。データコンテキストをウィンドウに設定する必要があります。 this.DataContext = this; –

0

あなたがプロパティのセッターからOnPropertyChangedを呼び出している:

が正しく、それはこのようになります実装しましたか?これは本当にそれが所属する場所です。

+0

これは適切ですが、イベントはどこからでも呼び出すことができます。 –

関連する問題