7

我正在向文本框添加验证规则(按照Adam Nathan的WPF 4 Unleashed示例)

启动应用程序时,我遇到以下神秘的错误消息

在“System.Windows.Data.Binding”上提供值引发异常

替代文字

错误是什么意思,需要做什么来解决这个问题?

这是完整的源代码

XAML

<Window.Resources>
    <Style x:Key="controlStyle" TargetType="{x:Type Control}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="RenderTransform">
                    <Setter.Value>
                        <RotateTransform Angle="20" />
                    </Setter.Value>
                </Setter>
                <Setter Property="Foreground" Value="Black" />
            </Trigger>
        </Style.Triggers>
        <Setter Property="FontSize" Value="22" />
        <Setter Property="Background" Value="Purple" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Height" Value="50" />
        <Setter Property="Width" Value="50" />
        <Setter Property="RenderTransformOrigin" Value=".5,.5" />
        <Setter Property="RenderTransform">
            <Setter.Value>
                <RotateTransform Angle="10" />
            </Setter.Value>
        </Setter>
        <Setter Property="TextBox.TextAlignment" Value="Right" />
    </Style>
    <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="Background" Value="Red" />
                <Setter Property="ToolTip" 
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <TextBox Style="{StaticResource textBoxStyle}">
            <TextBox.Text>
                <Binding>
                    <Binding.ValidationRules>
                        <local:JpgValidationRule />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </StackPanel>

    <StackPanel Orientation="Horizontal">
        <Button Style="{StaticResource controlStyle}">1</Button>
        <ComboBox Style="{StaticResource controlStyle}">
            <ComboBox.Items>2</ComboBox.Items>
        </ComboBox>
        <Expander Style="{StaticResource controlStyle}" Content="3" />
        <TabControl Style="{StaticResource controlStyle}">
            <TabControl.Items>4</TabControl.Items>
        </TabControl>
        <ToolBar Style="{StaticResource controlStyle}">
            <ToolBar.Items>5</ToolBar.Items>
        </ToolBar>
        <!--<InkCanvas Style="{StaticResource controlStyle}" />-->
        <TextBox Style="{StaticResource controlStyle}" Text="7" />
    </StackPanel>
</StackPanel>

JpgValidationRule

using System.Globalization;
using System.IO;
using System.Windows.Controls;

namespace StylesDemo
{
    public class JpgValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string fileName = value.ToString();

            // Reject nonexistent files:
            if (!File.Exists(fileName))
                return new ValidationResult(false, "Value is not a valid file!");

            // Reject files that don't end in .jpg:
            if (Path.GetExtension(fileName).ToUpper() != ".JPG")
                return new ValidationResult(false, "Value is not a .jpg file!");

            return new ValidationResult(true, null);
        }
    }
}
4

1 回答 1

5

我认为它与 TextBox.Text 的默认绑定模式有关,即 TwoWay,并且需要该路径。您可以尝试Mode="OneWay"在应该在这里工作的 Binding 标记中设置一个属性,但我不完全确定您的总体要求。

于 2010-10-10T06:43:42.077 回答