【问题标题】:WPF Data Binding to changing objectWPF 数据绑定到更改对象
【发布时间】:2010-10-24 18:14:18
【问题描述】:

我有一个显示当前登录用户名的用户控件。我已将控件中的 TextBlock 绑定到我的应用程序中 User 对象的 UserId 属性。

我遇到的问题是每次新用户登录时,我的绑定作为源的用户对象都会更改。

我可以想到一个解决方案,当用户对象发生变化时我会触发一个事件,这会被我控制,然后重新初始化绑定,但这似乎不太理想。

这个问题有解决办法吗,我感觉应该很常见吧?

干杯,

詹姆斯

【问题讨论】:

  • 是 User 对象发生了变化(如果是,它在哪里设置?)还是 UserId 发生了变化(在同一个 User 实例上)?
  • 如果 DataSource 发生变化,将 DataSource 设置为新对象应该会自动更新绑定控件。如果绑定属性正在更改..您需要 INotifyPropertyChanged

标签: c# wpf data-binding binding


【解决方案1】:

大多数 UI 绑定已经通过属性通知处理此问题,特别是(对于 WPF)INotifyPropertyChanged。 - 即,如果您在 single 实例上更新 UserId:

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”,那么它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多