我目前正在编写一个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.
}
当应用程序首次加载时,此绑定似乎有效,但当属性IsActive在dll中更改时,即Engine从Active变为Idle时,按钮的Enabled属性不会更改。
所以我只是想知道我想做的是否可行? Engine是单例并且是用外部dll写的这个事实是否会产生影响?任何反馈都会有很大的帮助。
提前致谢。
答案 0 :(得分:2)
您的引擎需要实现System.ComponentModel.INotifyPropertyChanged
界面有一个事件“ProperyChanged”,当某些事情发生变化时你的引擎必须触发(至少如果你想对这个变化作出反应)
答案 1 :(得分:0)
如果您正在使用Windows窗体,因为文本建议您需要举起活动或手动转发代表回电。
然后,表格可以订阅活动/代表并采取相应行动。
如果你正在使用WPF代码建议那么请接受DarkSquirrel42的建议并实现INotifyPropertyChanged
接口。