Укажите значение для System.Windows.Data.Binding, вызвало исключение - PullRequest
7 голосов
/ 10 октября 2010

Я добавляю правило проверки в текстовое поле (следующие примеры для WPF 4 Unleashed от Адама Натана)

При запуске приложения я сталкиваюсь со следующим загадочным сообщением об ошибке

Укажите значение для 'System.Windows.Data.Binding', вызвавшее исключение

alt text

Что означает ошибка ичто нужно сделать для решения проблемы?

Вот полный исходный код

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);
        }
    }
}

1 Ответ

5 голосов
/ 10 октября 2010

Я думаю, что это связано с режимом привязки по умолчанию для TextBox.Text, который является TwoWay, и для этого Path требуется. Вы можете попробовать установить Mode="OneWay" в качестве атрибута в теге Binding, который должен работать здесь, но я не совсем уверен в ваших общих требованиях.

...