将Label绑定到静态字符串

时间:2012-03-27 19:49:55

标签: c# .net winforms data-binding label

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

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

感谢任何帮助

4 个答案:

答案 0 :(得分:0)

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

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。

答案 1 :(得分:0)

我会:

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

答案 2 :(得分:0)

将BindableAttribute用于要将控件绑定到它的属性。

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

答案 3 :(得分:0)

我为这些事情使用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)使跨线程操作调用安全