WPF绑定验证incorect前缀

时间:2016-05-15 16:07:14

标签: c# .net wpf xaml

我是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。

我怎样才能使这个工作?

2 个答案:

答案 0 :(得分:0)

要使其正常运行,请确保按照以下步骤操作:

  1. 转到Visual Studio
  2. 选择新建项目 - &gt; WPF项目
  3. 将上述代码复制到<Grid> </Grid>代码
  4. 在项目中创建一个名为 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);
        }
    }
    

    }

  5. 现在将名称空间添加到项目中,如下面的

    的xmlns:C = “CLR-名称空间:WpfApplication2”

  6. 其中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 prefixc {{ 1}}映射到。 (或者只是将它放在项目的命名空间中,并使用上面提到的local前缀)