Привязка данных WPF к изменяющемуся объекту

У меня есть пользовательский элемент управления, который отображает имя текущего вошедшего в систему пользователя. Я привязал TextBlock в элементе управления к свойству UserId объекта User в моем приложении.

У меня проблема в том, что объект User, который моя привязка имеет в качестве источника, изменяется каждый раз, когда новый пользователь входит в систему.

Я могу придумать решение, в котором я запускаю событие, когда объект User изменяется, и это перехватывается моим элементом управления, который затем повторно инициализирует привязку, но это кажется не идеальным.

Есть ли решение этой проблемы, я считаю, что оно должно быть очень распространенным?

Ваше здоровье,

Джеймс


person James    schedule 08.05.2009    source источник
comment
Изменяется ли объект User (если да, то где он установлен?) Или изменяется UserId (в том же экземпляре User)?   -  person Marc Gravell    schedule 08.05.2009
comment
Если DataSource изменяется, установка DataSource для нового объекта должна автоматически обновлять связанные элементы управления. Если связанное свойство изменяется .. вам нужен INotifyPropertyChanged   -  person Gishu    schedule 08.05.2009


Ответы (1)


Большинство привязок пользовательского интерфейса уже обрабатывают это с помощью уведомлений о свойствах, в частности (для WPF) INotifyPropertyChanged. - т.е. если вы обновляете 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», то это должно работать.

person Marc Gravell    schedule 08.05.2009