2017-05-03 3 views
0

사용자가 정수 값을 입력 할 수있는 창 형식입니다. 이 값은 특정 유효 범위 내에있는 한 별도의 클래스 (foo)의 멤버를 업데이트하는 데 사용됩니다. 사용자가 무언가를 입력하면 사용자에게 매개 변수의 기본값이 사용될 것이라고 알리는 오류 메시지가 필요합니다.C# 속성 setter에서 사용자에게 오류 메시지를 "반환하는 방법"?

이 작업을 수행하기 위해 foo가 해당 필드를 설정하기 전에 Windows 양식의 코드에서 사용자 입력을 검사하는 동안 오류가 발생했으며 입력이 검사에 실패하면 메시지가 표시됩니다.

하지만 원시 사용자 입력을 클래스 foo 내의 속성 설정자에게 보내고 속성 검사자가 모든 오류 검사를 처리하도록하고 싶습니다. foo에서 사용자 인터페이스에 메시지를 표시해야 할 수도있는 다른 함수의 경우 문자열을 반환하기 만하지만 속성에 대한 상태 또는 값을 반환 할 수있는 방법은 없습니다. 속성 세터에서 다른 기능으로 어떤 종류의 상태 메시지를 버블 링하는 우아한 방법이 있습니까? foo가 사용자 인터페이스를 직접 수정하는 것을 원하지 않습니다.

어떤 도움이나 조언에 미리 감사드립니다, 나는 내 질문이 너무 모호하거나 내가 내 문제를 해결

+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를 구현하고 사용자에게 뭔가가 변경되었음을 알리는 데 필요할 때마다 Windows Form에 의해 잡히는 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"); 
    } 

} 

:

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