如何"返回"从C#属性setter到用户的错误消息?

时间:2017-05-03 17:12:30

标签: c# validation properties user-input

我有一个允许用户输入整数值的窗体。该值用于更新单独类(foo)的成员,只要它在某个有效范围内即可。如果用户输入了无效的内容,我想要一条错误消息告诉用户将使用该参数的默认值。

为了实现这一点,我在让foo设置相关字段之前错误地检查了Windows窗体代码中的用户输入,并且只是在输入未通过检查时显示消息。

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

提前感谢您提供任何帮助或提示,如果我的问题太模糊或者因为我是StackOverflow的新手而应该提出不同的问题,我深表歉意

1 个答案:

答案 0 :(得分:0)

我通过在我的类foo中实现INotifyPropertyChanged来解决我的问题(以及删除了几乎所有函数都返回字符串的需要),并且只要有必要让用户提出一个PropertyChanged事件就会被Windows窗体捕获知道事情发生了变化。

在课堂上的

-

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
     }
}