2017-05-03 11 views
0

我有一个窗体,允许用户输入一个整数值。此值用于更新单独类(foo)的成员,只要它落在某个有效范围内即可。如果用户输入了无效的内容,我想要一条错误消息告诉用户将使用参数的默认值。如何从C#属性设置器向用户“返回”错误消息?

为了做到这一点,我一直在错误检查窗口代码中的用户输入,然后让foo设置有问题的字段,并在输入检查失败时直接显示消息。

但我想要做的是将原始用户输入发送到foo类中的属性设置器,并让属性设置器处理所有错误检查。对于可能需要在用户界面上显示消息的foo中的其他函数,我只是返回一个字符串,但据我所知,无法从属性设置器返回任何类型的状态或值。有没有一种优雅的方式可以将某种状态消息从属性设置器冒泡到不同的功能?我不想让foo直接修改用户界面。

预先感谢任何帮助或提示,我道歉,如果我的问题是太模糊或我是新来的StackOverflow

+2

您可能会感兴趣[INotifyDataErrorInfo(https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(V = vs.110)的.aspx) –

+0

@ScottChamberlain原谅我,我对C#非常陌生 - 这是否会允许我以某种方式提出可能被窗体窗体捕获的事件? – Cobalt

+0

是的,你暗示接口,你可以用它来提供哪些属性有错误的信息。谷歌教程了解如何实现它,它与WinForms和WPF都集成在一起 –

回答

0

我固定我的问题应该有不同要求(以及去除需要返回通过在我的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 
    } 
}