将标签绑定到静态字符串
本文关键字:静态 字符串 绑定 标签 | 更新日期: 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)使跨线程操作调用变得安全