我是WPF和C#的新手,我的应用程序出了问题。我有一个TextBox,我希望有一个ValidationRule来验证文本。现在我想在TextBox中有一个默认值,但我无法弄清楚如何做到这一点。我已经尝试了很多方法,在谷歌搜索问题时我发现的提示似乎根本不起作用。
有没有办法在不使用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);
}
}
My TextBox如下所示:
<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()
{
}
}
答案 0 :(得分:3)
您必须知道,通常,如果您想以“正确”的方式实现WPF应用程序,您的XAML将绑定到ViewModel,保留属性。 我知道你必须留在这里的少量财产似乎有点沉重,但相信我,当你有更大的用户界面时它真棒。 您还可以查看触发器,它可以帮助您在不添加类的情况下验证某些内容(但如果您有许多字段需要验证,那么它会非常繁重) 我建议你看一下这篇文章,它真的帮助我了解了WPF验证的更多信息,如果你还没有读过它:
http://www.codeproject.com/KB/WPF/wpfvalidation.aspx
修改强>
默认值:
您的Project数据类必须实现“INotifyPropertyChanged”接口 这允许每次更改文本时触发事件,因此更新绑定。一旦你完成了(我鼓励你环顾四周使用谷歌,不幸的是我没有任何具体的文章建议,但你肯定会找到一个好的文章),只需在构造函数中初始化你的字符串,那样:
public ProjectData()
{
opcServerAddress = "Hello!";
}
然后,由于绑定,文本框将具有您刚刚指定的默认值,并且每次修改它时,opcServerAddress值将根据文本框中的值更新。 这将特别允许您在ProjectData类中使用此字符串(通常称为ViewModel,如果您有时间,请查看MVVM模型: Need good MVVM tutorial for WPF
MVVM: Tutorial from start to finish? 它非常有用,它被认为是在WPF中工作的“正确”方式
玩得开心! :)