C# 将标签绑定到静态字符串

C# 将标签绑定到静态字符串,c#,.net,winforms,data-binding,label,C#,.net,Winforms,Data Binding,Label,我制作了一个基本表单,它被应用程序中的大多数表单继承。基本表单包含一个状态栏控件,该控件显示内部为静态字符串的用户名。用户可以通过按状态栏上的按钮在应用程序中的任何位置切换用户。此时,状态栏中的用户名也应该更改,就好像现在它只在代码中更改,而UI对更改一无所知。我在谷歌上搜索了一下,发现需要通过实现INotifyProperty接口将标签与该静态字符串绑定。我已经实现了许多示例代码,但没有成功 感谢您的帮助您必须实现一个类来通知道具已更改,因此道具不能是静态的。结合单例模式,您就有了自己的解决方

我制作了一个基本表单,它被应用程序中的大多数表单继承。基本表单包含一个状态栏控件,该控件显示内部为静态字符串的用户名。

用户可以通过按状态栏上的按钮在应用程序中的任何位置切换用户。此时,状态栏中的用户名也应该更改,就好像现在它只在代码中更改,而UI对更改一无所知。我在谷歌上搜索了一下,发现需要通过实现INotifyProperty接口将标签与该静态字符串绑定。我已经实现了许多示例代码,但没有成功


感谢您的帮助

您必须实现一个类来通知道具已更改,因此道具不能是静态的。结合单例模式,您就有了自己的解决方案

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";
并绑定到全局。获取属性用户名。

我会:

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";
    }
}

对要将控件绑定到的属性使用BindableAttribute

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

我对这些东西使用反应式扩展

例如,如果您有一个具有属性用户名的上下文类

你可以这样做

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);
         }
      }
   }
}

ObserveOn(SynchronizationContext.Current)使跨线程操作调用变得安全

这是什么OnNext?
   Context.UserChanged.ObserveOn(SynchronizationContext.Current)
                      .Subscribe(user => label.Text = user);