IDataError를 사용하여 컨트롤 및 텍스트 상자에서 내 개체 속성의 유효성을 검사하고 있습니다. 클래스에서 몇 가지 유효성 검사를 추가 한 다음 텍스트 상자 컨트롤에 바인딩을 추가했습니다.IDataErrorInfo 및 null 속성 바인딩 확인
public class Customer : IDataErrorInfo
{
public string FirstName { get; set; }
public string LastName { get; set; }
public long TributaryCode { get; set; }
#region IDataErrorInfo Members
public string Error
{
get { throw new NotImplementedException(); }
}
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";
}
return result;
}
}
#endregion
}
미안 데 문제가 TributaryCode가 비어있을 때, 나는 그것이 값을 '변환 할 수 없습니다라는 예외를 얻을 수 있습니다 :
이 내 클래스입니다. 이것은 종속 코드가 길고 null 값을 지원하지 않기 때문에 obviosly throw됩니다. 또한 텍스트 상자를 포함하는 UserControl이로드 될 때 값은 0으로 표시됩니다. 원하는 것은 비어있는 상태에서 시작하고 텍스트 상자가 비어 있으면 해당 예외를 throw하지 않는 것입니다.
그러면 무엇을해야합니까? 모든 속성을 nullable로 작성해야합니까? 그런 다음 이러한 클래스는 WCF 서비스의 요청 클래스로 변환되므로 가능한 해결책이지만 이것이 맞는지 질문하고 싶습니다.
또한 내가 말했듯이 이러한 모든 컨트롤은 UserControl에 있습니다. 이 UserControl 들어 ScrollViewer 들어있는 하나의 창이 있습니다. 유효성 검사는 텍스트 상자의 LostFocus 이벤트에서 수행되지만, 어떤 이유로 Window가 UserControl을로드하고로드 할 때 모든 빈 TextBox에 이미 유효성 검사를 통과하지 못했음을 나타내는 빨간색 테두리가 표시됩니다. 왜 이런 일이 일어날 수 있습니까? UserControl 항목과 관련이 있어야합니다.
이 내 텍스트 상자 XAML 중 하나입니다
<TextBox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1"
Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName,
ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />
감사합니다!
답장을 보내 주셔서 감사합니다. 이미 TributaryCode 텍스트 상자를 "마스크"하여 숫자 만 허용하도록 사용자를 제한했습니다. 솔루션이 긴 것을 사용하는지 알고 싶습니다. 대신에 길다. 그런 다음 유효성 검사에 대해 필자는 텍스트 상자가 포커스를 얻었을 때 유효성을 확인한 다음 포커스를 잃어 버렸을 때 유효성을 검사한다고 생각했습니다. 초기화하지 않을 때.나는 사용자가 창을 열고 빨간색 테두리가있는 텍스트 상자가 가득 찬 창을보고 그가 아이디어를 완성하려고 시도 할 때처럼 생각하지 않습니다. 너 무슨 말인지 알지? – Andres
'TextBox' 컨트롤에서'Binding.UpdateSourceTrigger'를'LostFocus'로 변경하면'TextBox' 포커스가 없어 질 때까지'Binding' 업데이트를 지연시켜야합니다.하지만 그렇게 할 수 있다고 보장 할 수는 없습니다 시작 유효성 검증 오류를 제거합니다. – Sheridan
네, 그랬습니다. 내 질문에 XAML 코드를 보여줍니다. 나는 그 행동이 창에서 일어나지 않는다고 확신했다. 그래도 확인해야합니다. – Andres