2011-03-25 5 views
1

WPF 및 C#에 익숙하지 않아 응용 프로그램에 문제가 있습니다. 텍스트 유효성을 검사하기 위해 ValidationRule이 필요한 TextBox가 있습니다. 이제 TextBox에 기본값을 갖고 싶지만 어떻게해야하는지 알 수 없습니다. 나는 문제의 인터넷 검색이 전혀 작동하지 않는 것처럼 보이는 많은 방법과 팁을 시도했다.C# WPF 바인딩, ValidationRule 및 기본값

또한 ProjectData 클래스 파일을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 내게는 검증을 달성하기 위해 단지 하나의 값을 가진 클래스를 만들어야하는 것이 이상한 것처럼 보입니다.

내 ValidationRule은 다음과 같습니다 : 내 텍스트 상자는 다음과 같습니다

public class OpcValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      string source = (string)value; 
      if(!source.StartsWith("Test")) 
      { 
       return new ValidationResult(false, msg); 
      } 


      // Valid!!!! 
      return new ValidationResult(true, null); 
     } 
    } 

:

<TextBox x:Name="OPCAddressBox" Style="{StaticResource textBoxInError}" HorizontalAlignment="Right" TextWrapping="NoWrap" VerticalAlignment="Top" Margin="0,10,8,0" Width="150"> 
        <TextBox.Text> 
         <Binding Path="OpcServerAddress" Source="{StaticResource pdd}" UpdateSourceTrigger="PropertyChanged"> 
          <Binding.ValidationRules> 
           <local:OpcValidationRule /> 
          </Binding.ValidationRules> 
         </Binding> 
        </TextBox.Text> 
       </TextBox> 

내 리소스는 다음과 같습니다

<Window.Resources> 
     <local:ProjectData Height="1000" Width="1000" OpcServerAddress="opc.tcp://address:port" x:Key="pdd"/> 

     <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="true"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

내 ProjectData 파일은 다음과 같다 :

public class ProjectData 
    { 
     private string opcServerAddress; 
     public string OpcServerAddress 
     { 
      get { return opcServerAddress; } 
      set { opcServerAddress = value; } 
     } 

     public ProjectData() 
     { 
     } 
    } 

답변

3

일반적으로 WPF 응용 프로그램을 "올바른"방법으로 구현하려면 XAML이 속성을 유지하면서 ViewModel에 바인딩된다는 것을 알아야합니다. 나는 여기에 머물러야하는 소량의 재산에 대해 다소 무겁다 고 생각하지만, 더 큰 UI를 가지고있을 때 정말 멋지다. 클래스를 추가하지 않고도 유효성을 검사하는 데 도움이되는 트리거에 대해 살펴볼 수도 있습니다. (유효성 검사 할 필드가 많은 경우 매우 무거울 것입니다.) 이 기사를 통해 내가 WPF에서 검증, 당신이 경우 이미 그것을 읽을 수 없습니다 : 기본 값

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

편집

:

프로젝트 데이터 클래스 난에있다 인터페이스 "INotifyPropertyChanged"를 구현하십시오 텍스트를 변경할 때마다 이벤트를 발생시켜 바인딩을 업데이트 할 수 있습니다. 일단 당신이 그것을했으면 (나는 당신이 구글을 사용하여 주변을 둘러 보도록 권하고 싶다. 불행하게도 나는 구체적인 기사가 없지만, 당신은 확실히 좋은 것을 찾을 것이다), 그냥 생성자에서 문자열을 초기화한다. 그렇게 : 다음

public ProjectData() 
     { 
      opcServerAddress = "Hello!"; 
     } 

, 바인딩 덕분에, 텍스트 상자 방금 지정한 기본 값을 갖게됩니다, 그리고 당신이 그것을 수정 때마다, opcServerAddress 값은 텍스트 상자의 값 다음 업데이트됩니다. 매우 유용 Need good MVVM tutorial for WPF

MVVM: Tutorial from start to finish? 하고,이를 것으로 간주됩니다 : 특히 당신이 시간이 경우 MVVM 모델을 확인, 일반적으로 뷰 모델이라는 ProjectData 클래스 (이 문자열을 사용 할 수 있습니다 WPF에서 작동하는 "적절한"방법)

재미있게 보내십시오! :)

+0

Damascus 링크 덕분에 WPF 유효성 검사에 대해 더 잘 이해할 수있었습니다. 그러나 텍스트 상자에 기본값을 갖기 위해 원래의 문제에 대한 해결책을 찾지 못했습니다. – chiefi

+0

아 죄송합니다.이 문제를 읽지 않았습니다 ... 몇 가지 유용한 조언을 통해 메시지를 수정했습니다. :) – Damascus

+0

감사합니다. 귀하의 게시물 정말 날 도와 줬어. – chiefi