2013-06-10 3 views
0

WPF에 두 개의 텍스트 상자가 있습니다. txt1 및 txt2로 명명됩니다. txt1의 lostFocus에서 WPF에서 이벤트 사용

나는 txt1 및 txt2이 모두 비어 있고 사용자가 txt1에서 TAB 키를 누르면 내가 지금

If txt2.Text is nothing then 
    txt2.Focus 
End If 

쓰기 txt2의 LostFocus 이벤트에서

If txt1.Text is nothing then 
    txt1.Focus 
End If 

쓰기 문제가 발생합니다. 프로그램은 무한 루프로 진행됩니다. 나는 커서가 txt1에오고 무한정 txt2로 간다는 것을 의미한다. 나는 이것이 내 코드에 따른 정상적인 동작이라는 것을 알고있다.

위와 같은 문제를 방지하기 위해 유효성 검사 이벤트를 갖고 싶습니다. WPF에서 찾을 수 없습니다. 그래서 어떤 이벤트를 사용해야합니까?

+0

대신을 지주 MessageBox를 표시 하시겠습니까? 또는 폼의 끝에 도달하여 사용자가 제출 버튼을 누를 때까지 유효성 확인을 유지하지 않는 이유는 무엇입니까? – Ripster

답변

1

나는 VB 코더가 아니므로 정확한 코드를 작성할 수는 없지만 여기에해야 할 일이 있습니다. PreviewLostKeyboardFocus 이벤트에 대한 이벤트 처리기를 추가하십시오. 텍스트가 비어 있으면 e.Handled가 true로 설정됩니다. 예제 C# 코드입니다. 필자는 일반 처리기를 작성했습니다.

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    if (string.IsNullOrEmpty((sender as TextBox).Text)) 
    { 
     e.Handled = true; 
    } 
} 
+0

그리고 마우스 때문에 초점이 어지럽습니까? – Vishal

+1

@Vishal 이것은 이전에 요청한 것이 아닙니다. 내가 제안한 코드를 사용해 보셨습니까? 이 코드를 사용하면 마우스를 사용하는 경우에도 텍스트 상자에 다시 포커스를 놓을 수 있습니다. – Nishant

+0

당신의 대답을 무시한 것에 대해 가슴 아프게해서 죄송합니다. 이것은 완벽한 해답입니다. – Vishal

0

더 나은 솔루션은 사용자가 빈/널 (null) 텍스트 상자에서 멀리 이동하지만 (있는 경우) 초기 값으로 텍스트를 되돌 리거나 유효성 검사 오류를 제공하거나 할 수 있도록 수 있습니다. IDataErrorInfo를 사용하면 유효성 검사 오류를 상대적으로 쉽게 제공 할 수 있습니다.

소프트웨어 사용자로서 나는 응용 프로그램이 나를 필드에서 벗어나지 못하게 할 때 짜증이납니다.

재설정 값 접근

유지하고 이전 값을 얻는 방법이 유래의 appraoch를 참조하십시오. 현재 값이 유효하지 않은 경우 LostFocus 이벤트에서 멤버 변수를 _oldValue로 다시 설정할 수 있습니다. 그 두 날짜가 모델이나 뷰 모델 클래스에 저장됩니다

determine a textbox's previous value in its lost focused event? WPF

검증 접근. 이 클래스에서는 IDataErrorInfo (http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo(v=vs.95).aspx)를 구현합니다. 그런 다음 xaml에서 유효성 검사 오류를 표시 할 수 있습니다. 또한 이러한 다른 StackOverflow에 볼 수 있습니다

//This is your model/viewmodel validation logic 
public string this[string columnName] 
{ 
    get 
    { 
     string result = null; 
     if (columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result = "Please enter a First Name"; 
     } 
     if (columnName == "LastName") 
     { 
      if (string.IsNullOrEmpty(LastName)) 
       result = "Please enter a Last Name"; 
     } 
     if (columnName == "Age") 
     { 
      if (Age < = 0 || Age >= 99) 
       result = "Please enter a valid age"; 
     } 
     return result; 
    } 
} 

//Here is a sample of a xaml text block 
<textbox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1" Validation.Error="Validation_Error" Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName, ValidatesOnDataErrors=true, NotifyOnValidationError=true}" /> 

필드 데이터를 필요로하거나 빨간색 보여주는에서 텍스트 상자를 간략하게 설명하지 왜 초점을 잃게 텍스트 상자에 포커스를 다시 설정 What is IDataErrorInfo and how does it work with WPF? IDataErrorInfo notification

+0

저는 회계 프로젝트의 시작 부분에 있습니다. 거기에 사용자로부터 두 개의 날짜가 필요합니다. 회계 연도 시작일 및 회계 연도 종료일 및 둘 모두 필요합니다. 그래서,이 경우에 당신은 무엇을 제안합니까? – Vishal

+0

두 필드가 유효성 검사를 통과 할 때까지 다음 작업을 활성화하지 마십시오 (null이 아님). – Darlene

+0

suggetion에 감사드립니다. 그러나 문제는 Nishant에 의해 해결되었습니다. – Vishal