如何解决将Button.Enabled绑定到C#dll中的属性
| 我目前正在编写一个C#dll,用作希望使用它的GUI应用程序(Windows窗体)的后端引擎。引擎可以处于几种预定义状态之一,例如加载,空闲,工作等,由后台工作人员控制。我希望使用该dll的GUI应用程序能够执行操作并将控件属性绑定到引擎内的属性,特别是引擎当前处于的状态。例如,我希望使用该引擎的应用程序基于以下功能禁用操作和控件有关引擎是否正在运行的信息。为此,我在引擎内创建了一个只读属性,如下所示:public Class Engine
{
// Make the class a singleton
private static Engine instance;
public static Engine Instance
{
get
{
if (instance == null)
instance = new Engine();
return instance;
}
}
// ... Class code altering the engines current state
public bool Property IsActive
{
get
{
return (Enginestate != State.Idle);
}
}
}
其中State是所有可能状态的枚举器,而Enginestate是当前状态。为了测试该属性,我编写了一个快速的Windows窗体应用程序,如果引擎处于活动状态,则希望在其中启用按钮。为此,我尝试像这样绑定Enabled属性:
public Class TestApp
{
Engine MyEngine = Engine.Instance;
TestApp
{
Button_DoAction.DataBindings.Add(\"Enabled\",MyEngine,\"IsActive\");
}
// ... Button handlers etc.
}
此绑定似乎在应用程序首次加载时起作用,但是当DLL中的IsActive属性更改时,即Engine从Active变为Idle时,按钮的Enabled属性不会更改。
所以我只是想知道我要做什么?引擎是单例并用外部dll编写的事实意味着有所不同吗?任何反馈都将有很大的帮助。
提前致谢。
解决方法
您的引擎需要实现System.ComponentModel.INotifyPropertyChanged
界面上有一个事件“ ProperyChanged \”,当某件事发生更改时,您的引擎必须将其触发(至少如果您希望某件事对该更改做出反应)
参见MSDN http://msdn.microsoft.com/en-gb/library/system.componentmodel.inotifypropertychanged%28v=vs.95%29.aspx
,如果您使用的是Windows窗体,如文本所示,则需要引发一个事件或手动回滚一个委托回叫。
然后,表单可以订阅事件/委托并采取相应的行动。
如果您按照代码的建议使用WPF,则应遵循DarkSquirrel42的建议并实现
INotifyPropertyChanged
接口。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。