我制作了一个基本表单,该表单由应用程序中的大多数表单继承。基本表单包含状态栏控件,该控件显示内部为静态字符串的用户名。
用户可以通过按状态栏上的按钮在应用程序的任何位置Switch User
。此时,状态栏中的用户名也应该更改,就像现在它只会更改代码而UI不知道更改。我已经google了一下,发现我需要通过实现一个INotifyProperty接口将标签与该静态字符串绑定。我已经实现了许多示例代码而没有成功。
感谢任何帮助
答案 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)使跨线程操作调用安全