我是WPF的新手,我试图从https://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396实施绑定验证,
我从网站复制XAML和c#代码,XAML中的前缀有问题
<TextBox Name="textBox1" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Age" Source="{StaticResource ods}"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
写道没有c前缀。我试图使用所有可能的前缀,但它抛出了此前缀不支持AgeValidationRule。
我怎样才能使这个工作?
答案 0 :(得分:0)
要使其正常运行,请确保按照以下步骤操作:
<Grid> </Grid>
代码在项目中创建一个名为 AgeRangeRule.cs 的类,并将以下代码添加到类文件中。
公共类AgeRangeRule:ValidationRule { private int _min; private int _max;
public AgeRangeRule()
{
}
public int Min
{
get { return _min; }
set { _min = value; }
}
public int Max
{
get { return _max; }
set { _max = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int age = 0;
try
{
if (((string)value).Length > 0)
age = Int32.Parse((String)value);
}
catch (Exception e)
{
return new ValidationResult(false, "Illegal characters or " + e.Message);
}
if ((age < Min) || (age > Max))
{
return new ValidationResult(false,
"Please enter an age in the range: " + Min + " - " + Max + ".");
}
else
{
return new ValidationResult(true, null);
}
}
}
现在将名称空间添加到项目中,如下面的
的xmlns:C = “CLR-名称空间:WpfApplication2”
其中c是此处引用的命名空间,WpfApplication2将替换为您的解决方案名称。
编辑:下面更新了XAML代码。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
<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>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Name="textBox1" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Age" Source="{StaticResource ods}"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<local:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
</Window>
答案 1 :(得分:0)
写道没有c前缀。
<Binding.ValidationRules>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
XAML
使用prefix
在您的解决方案中映射namespace
。在msdn的xaml示例代码中某处的含义应该声明c
前缀,该前缀映射到AgeRangeRule
类应该位于的命名空间。
为简单起见,您只需将AgeRangeRule
类添加到项目中,并使用映射到项目命名空间的local
前缀(例如xmlns:local="clr-namespace:WpfApplication1"
表示我已命名我的项目WpfApplication1
因此我可以通过前缀namespace
访问local
中的任何类。
此前缀不支持AgeValidationRule。
这表明您已经更改了样本xaml代码......
<Binding.ValidationRules>
<c:AgeValidationRule Min="21" Max="130"/>
</Binding.ValidationRules>
因此,您还应将msdn提供的示例AgeRangeRule
类更改为AgeValidationRule
...并将其放入namespace
prefix
中c
{{ 1}}映射到。 (或者只是将它放在项目的命名空间中,并使用上面提到的local
前缀)