2012-03-27 36 views
0

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

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

感谢所有帮助

回答

0

您必须实现一个类来通知道具改变。因此,道具不能是静态的。结合单身模式,你有解决方案。

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财产名。

0

我会:

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

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

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

我用无扩展这些东西

例如,如果你有一个属性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

这是什么OnNext? – MonsterMMORPG 2014-08-13 21:50:25