我已经做了一个基本形式,由应用程序中的大多数表单继承。基本形式包含一个状态栏控件,显示内部为静态字符串的用户名。
用户可以通过按状态栏上的按钮在应用程序的任何位置Switch User
。此时,状态栏中的用户名也应该改变,就好像现在它只在代码中改变一样,UI也不知道改变。我搜索了一下,发现我需要通过实现INotifyProperty接口将该标签与该静态字符串绑定。我已经实现了很多示例代码,但没有成功绑定标签到一个静态字符串
感谢所有帮助
我已经做了一个基本形式,由应用程序中的大多数表单继承。基本形式包含一个状态栏控件,显示内部为静态字符串的用户名。
用户可以通过按状态栏上的按钮在应用程序的任何位置Switch User
。此时,状态栏中的用户名也应该改变,就好像现在它只在代码中改变一样,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";
并绑定到Global.Get财产名。
我会:
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.
}
}
我用无扩展这些东西
例如,如果你有一个属性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)使它对跨线程操作调用是安全的
这是什么OnNext? – MonsterMMORPG 2014-08-13 21:50:25