2017-05-03 43 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 
    } 
}