C# 将标签绑定到静态字符串
我制作了一个基本表单,它被应用程序中的大多数表单继承。基本表单包含一个状态栏控件,该控件显示内部为静态字符串的用户名。C# 将标签绑定到静态字符串,c#,.net,winforms,data-binding,label,C#,.net,Winforms,Data Binding,Label,我制作了一个基本表单,它被应用程序中的大多数表单继承。基本表单包含一个状态栏控件,该控件显示内部为静态字符串的用户名。用户可以通过按状态栏上的按钮在应用程序中的任何位置切换用户。此时,状态栏中的用户名也应该更改,就好像现在它只在代码中更改,而UI对更改一无所知。我在谷歌上搜索了一下,发现需要通过实现INotifyProperty接口将标签与该静态字符串绑定。我已经实现了许多示例代码,但没有成功 感谢您的帮助您必须实现一个类来通知道具已更改,因此道具不能是静态的。结合单例模式,您就有了自己的解决方
用户可以通过按状态栏上的按钮在应用程序中的任何位置切换用户。此时,状态栏中的用户名也应该更改,就好像现在它只在代码中更改,而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";
并绑定到全局。获取属性用户名。我会:
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.
}
}
我对这些东西使用反应式扩展 例如,如果您有一个具有属性用户名的上下文类 你可以这样做
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);
}
}
}
}
ObserveOn(SynchronizationContext.Current)使跨线程操作调用变得安全这是什么OnNext?
Context.UserChanged.ObserveOn(SynchronizationContext.Current)
.Subscribe(user => label.Text = user);