2009-05-08 10 views
5

現在ログインしているユーザーの名前を表示するユーザーコントロールがあります。コントロール内のTextBlockを、アプリケーションのUser obdjctのUserIdプロパティにバインドしました。WPFデータバインディングオブジェクトの変更

私が持っている問題は、ユーザーがソースが新しいユーザーログを毎回変えるように私結合を持つオブジェクトということである。

私は、ユーザーobejctの変更イベントを発生ソリューションを考えると、このことができます私はコントロールによって私のことを捕まえられていますが、バインディングを再初期化しますが、理想的ではありません。

この問題の解決法はありますか?それは非常に一般的でなければならないと感じていますか?

乾杯、

ジェームズ

+0

Userオブジェクトが変更されている場合は、そのUserオブジェクトが変更されていますか?同じUserインスタンスで変更されたUserIdですか? –

+0

DataSourceが変更されている場合、DataSourceを新しいオブジェクトに設定すると、バインドされたコントロールが自動的に更新されます。バウンドプロパティが変更されている場合は、INotifyPropertyChangedが必要です – Gishu

答えて

7

は、ほとんどのUIバインディングは、すでにINotifyPropertyChanged(WPFのために)特に、プロパティの通知を経由してこれを処理します。 - あなたは単一インスタンス上でユーザーIDを更新している場合、すなわち:

class User : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if(handler!=null) handler(this, new PropertyChangdEventArgs(
              propertyName)); 
    } 
    private string userId; 
    public string UserId { 
     get {return userId;} 
     set { 
      if(userId != value) { 
       userId = value; 
       OnPropertyChanged("UserId"); 
      } 
     } 
    } 
} 

これは、自動的にバインディングを更新する必要があります。あなたがいる場合は、代わりに、実際のユーザーインスタンスを変更し、その後、同じトリックを検討しますが、何に対してユーザーをホスト:

public User User { 
    get {return user;} 
    set { 
     if(user != value) { 
      user = value; 
      OnPropertyChanged("User"); 
     } 
    } 
} 

をそして、あなたが何かの「User.UserId」に結合されている場合、それが動作するはずです。

関連する問題