Метка привязки к статической строке - PullRequest
0 голосов
/ 27 марта 2012

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

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

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

Ответы [ 4 ]

0 голосов
/ 28 марта 2012

Я использую Reactive Extensions для этих вещей

Например, если у вас есть класс 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) делает его безопасным для вызовов операций между потоками

0 голосов
/ 28 марта 2012

Я бы:

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

Обработчик тика таймера будет выглядеть примерно так:

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";
    }
}
0 голосов
/ 28 марта 2012

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

[Bindable(true)]
public int Username {
   get {
       // Insert code here.
       return 0;
   }
   set {
      // Insert code here.
   }
}
0 голосов
/ 28 марта 2012

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

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.

...