将标签绑定到静态字符串

本文关键字:静态 字符串 绑定 标签 | 更新日期: 2023-09-27 18:29:15

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

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

感谢任何帮助

将标签绑定到静态字符串

使用BindableAttribute作为要将控件绑定到它的属性。

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

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

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

并绑定到全局。获取属性UserName。

我会:

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

我对使用反应扩展

例如,如果您有一个属性为UserName 的Context类

你可以做这个

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)使跨线程操作调用变得安全