2011-03-25 41 views
1

我是WPF和C#的新手,我的应用程序出现问题。我有一个文本框,我想有一个ValidationRule来验证文本。现在我想在TextBox中有一个默认值,但我无法弄清楚如何去做。我尝试了很多方法,并且在Google上搜索问题时发现的提示似乎根本不起作用。C#WPF绑定,验证规则和默认值

也有没有办法做到这一点,而不使用ProjectData类文件?对我来说,似乎很难做出只有一个价值的课程才能实现验证。

我的有效性规则是这样的:

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,并保留属性。 我知道,你必须留在这里的财产的数量似乎有点沉重,但相信我,当你有更大的用户界面时,这真是太棒了。 你也可以浏览一下触发器,它可以帮助你在不添加类的情况下验证一些东西(但是如果你有很多字段需要验证的话,这将会非常繁重) 我建议你看看这篇文章,它真的帮助我了解更多在WPF的验证,如果你还没有阅读:

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

编辑

对于默认值:

项目数据类有我实现接口“INotifyPropertyChanged” 这允许每次更改文本时触发事件,因此更新绑定。一旦你完成了这个任务(我鼓励你使用谷歌浏览器,不幸的是我没有任何特定的文章可以提供,但你肯定会找到一个很好的文章),只需在构造函数中初始化你的字符串,这样的:

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

然后,多亏了绑定,文本框将您刚才指定的默认值,并在每次修改时,opcServerAddress值将下面的文本框中的值进行更新。 这尤其让您在ProjectData的类(通常称为视图模型使用这个字符串,如果你有时间,检查出的MVVM模式: Need good MVVM tutorial for WPF

MVVM: Tutorial from start to finish? 它是非常有用的,它被认为是“适当”的方式在WPF工作)

玩得开心! :)

+0

感谢那个链接大马士革,它帮助我了解更多的WPF验证。但是,我没有找到任何解决方案,但我的原始问题,在文本框中有一个默认值。 – chiefi 2011-03-25 10:35:48

+0

哦对不起,我没有看到这个问题...只是编辑我的消息,一些有用的建议:) – Damascus 2011-03-25 11:15:14

+0

非常感谢,现在就开始工作。你的文章真的帮了我。 – chiefi 2011-03-26 10:26:47