Привязка метки к статической строке

Я создал базовую форму, которая наследуется большинством форм в приложении. Базовая форма содержит элемент управления строки состояния, который отображает имя пользователя, которое внутри является статической строкой.

Пользователь может Switch User в любой момент приложения, нажав кнопку в строке состояния. В этот момент имя пользователя в строке состояния также должно измениться, как будто теперь оно меняется только в коде, а пользовательский интерфейс не знает об изменении. Я погуглил и обнаружил, что мне нужно связать метку с этой статической строкой, внедрив интерфейс INotifyProperty. Я реализовал много примеров кода без успеха.

Ценю любую помощь


person PUG    schedule 27.03.2012    source источник


Ответы (4)


Вы должны реализовать класс для уведомления об изменении реквизита, и поэтому реквизит не может быть статическим. Объедините с одноэлементным шаблоном, и у вас есть решение.

public class Global : INotifyPropertyChanged
{
    private string _userName;

    public string UserName
    {
        get
        {
            return this._userName;
        }
        set
        {
            if (this._userName == value)
            {
                return;
            }

            this._userName = value;

            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("UserName"));
            }
        {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private Global() {}

    public static readonly Global Get = new Global();
}

Применение:

var currUserName = Global.Get.UserName;

Global.Get.PropertyChanged += (s, e) => Console.WriteLine(e.PropertyName);
Global.Get.UserName = "John";

И привяжите Global.Get к свойству UserName.

person SimpleVar    schedule 27.03.2012

Я бы:

1- Добавьте таймер в базовую форму для обновления строки состояния. (разрешение таймера соответствует вашему требованию).

обработчик таймера Tick будет примерно таким:

private void timerStatusUpdate_Tick(object sender, EventArgs e)
{
    toolStripStatusLabelMessage.Text = StatusMessage();
}

2 - Добавьте в базовый класс виртуальный метод StatusMessage:

class BaseForm : Form
{
    .......

    public virtual string StatusMessage()
    {
        return "override me!";
    }
}

3- переопределить StatusMessage во всех ваших производных классах

class XXXForm : BaseForm
{
    ........

    public override string StatusMessage()
    {
        return "XXXForm status message";
    }
}
person nouryan    schedule 27.03.2012

используйте BindableAttribute для свойства, к которому вы хотите привязать элемент управления.

[Bindable(true)]
public int Username {
   get {
       // Insert code here.
       return 0;
   }
   set {
      // Insert code here.
   }
}
person pylover    schedule 27.03.2012

Я использую реактивные расширения для этих вещей

Например, если у вас есть класс Context со свойством UserName

ты мог бы сделать это

public static class Context
{
   public static Subject<string> UserChanged = new Subject<string>();

   private static string user;
   public static string User
   {
      get { return user; }
      set
      {
         if (user != value)
         {
            user = value;

            UserChanged.OnNext(user);
         }
      }
   }
}

А затем на ваших формах просто сделайте

   Context.UserChanged.ObserveOn(SynchronizationContext.Current)
                      .Subscribe(user => label.Text = user);

ObserveOn(SynchronizationContext.Current) делает его безопасным для вызовов операций с несколькими потоками.

person David DV    schedule 28.03.2012
comment
что это за OnNext? - person MonsterMMORPG; 14.08.2014