我固定我的问题应该有不同要求(以及去除需要返回通过在我的foo类中实现INotifyPropertyChanged并引发一个PropertyChanged事件,以便在需要让用户知道某些内容发生变化时由窗体窗口捕获到这些事件。
类
foo-
public class foo : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public int bar;
private void NotifyPropertyChanged(string type) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(type));
}
}
private void test(){
bar = 1;
NotifyPropertyChanged("changed int");
}
}
在Windows窗体
:
public partial class GUI : Form {
foo fooinstance = new foo();
public GUI(){
InitializeComponent();
fooinstance.PropertyChanged += doEvent;
}
private void doEvent(object sender, PropertyChangedEventArgs e){
foo updated = sender as foo;
if (object.ReferenceEquals(e.PropertyName, "changed int")) {
ShowWhatChanged(updated.bar); //show on GUI
}
}
}
编辑: 更优雅,我结束了使用更清洁的方式是利用回调。 GUI在实例化时将函数指针传递给foo,并且foo将其用作委托,以在必要时将字符串传回GUI。无需事件:
public class foo {
public delegate void UpdateCallback(string msg);
private UpdateCallback _ucb;
public foo(UpdateCallback cb){
_ucb = cb;
}
private void test(){
if(_ucb != null) {
_ucb("Message Here");
}
}
}
public partial class GUI : Form {
public GUI(){
InitializeComponent();
foo fooinstance = new foo(showmessage);
}
private void showmessage(string msg){
//do whatever with the message
}
}
您可能会感兴趣[INotifyDataErrorInfo(https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(V = vs.110)的.aspx) –
@ScottChamberlain原谅我,我对C#非常陌生 - 这是否会允许我以某种方式提出可能被窗体窗体捕获的事件? – Cobalt
是的,你暗示接口,你可以用它来提供哪些属性有错误的信息。谷歌教程了解如何实现它,它与WinForms和WPF都集成在一起 –