WPF如何在文本框中使用验证规则而不创建要在对话框中绑定的额外属性?

时间:2014-04-01 02:48:43

标签: c# wpf validation xaml

所以我有一个在这里工作的例子:

     <TextBox.Style>
          <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
              <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                          Value="{Binding RelativeSource={RelativeSource Self}, 
                        Path=(Validation.Errors), Converter={StaticResource ValidationConverter}}"
                        />
              </Trigger>
              <Trigger Property="Validation.HasError" Value="false">
                <Setter Property="ToolTip"
                          Value="GraphPenWidth" />
                <Setter Property="Background" 
                    Value="Blue"
                    />
              </Trigger>
            </Style.Triggers>
          </Style>
        </TextBox.Style>
        <TextBox.Text>
          <Binding Path="GraphPenWidth" UpdateSourceTrigger="PropertyChanged"  Mode="TwoWay">
            <Binding.ValidationRules>
              <DaedalusValidationRules:IntegerValidationRule />
            </Binding.ValidationRules>
          </Binding>
        </TextBox.Text>

但是,有没有办法在不绑定到datacontext的情况下使用验证规则?

我正在尝试创建一个通用对话框,我可以将各种验证规则传递给。 但是,我发现一段时间后,即使我在xaml中创建验证规则,它也无法正常工作。我曾经读过我可以将TextBox的文本属性绑定到自身,但这不起作用。

但是,当我在ValidationRule中放置一个断点时,我在插入数据时似乎正在调用正确的点。此外,样式似乎有效,因为背景为蓝色。这让我相信Validation.HasError永远不会成为现实,或者变得真实并且变得如此之快以至于我无法看到变化。

在我输入的每个字母后调用验证规则,但文本框不会更新以显示haserror = true。这是为什么?

我是不是被允许将属性绑定到自身?有没有其他方法我可以使用验证规则没有绑定或我只是总是要创建一个额外的属性来绑定?最短的修复只是创建一个额外的文本属性并无意义地绑定它,但我希望这不是必要的。

 <TextBox    
    Margin="3"
    Height="25"
    VerticalAlignment="Center"
    VerticalContentAlignment="Center"
    HorizontalContentAlignment="Left"
    Grid.Column="1"
    x:Name="MainTextBox"
    >
    <TextBox.Text>
      <Binding RelativeSource="{RelativeSource Self}" Path="Text" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
          <rules:IntegerValidationRule />
        </Binding.ValidationRules>
      </Binding>
    </TextBox.Text>

    <TextBox.Style>
      <Style 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), Converter={StaticResource ValidationConverter}}"
                    />
            <Setter Property="Background" 
                    Value="Red"
                    />
          </Trigger>
          <Trigger Property="Validation.HasError" Value="false">
            <Setter Property="ToolTip"
                          Value="Default Signal Height Percentage" />
            <Setter Property="Background" 
                    Value="Blue"
                    />
          </Trigger>
        </Style.Triggers>
      </Style>
    </TextBox.Style>
  </TextBox>

所以我实际上设法通过在GenericDialogBox上绑定一个名为Text的属性然后将Text属性绑定到Textbox的Text属性来设置在xaml中进行验证。但是,我似乎无法在后面的代码中使用相同的代码。

  <TextBox.Text>
      <Binding Path="Text" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
          <rules:IntegerValidationRule />
        </Binding.ValidationRules>
      </Binding>
    </TextBox.Text>

但是当我在后面的代码中尝试这个时,它不起作用。

  Binding myBinding = new Binding();
  myBinding.Source = this;
  myBinding.Path = new PropertyPath("Text");
  myBinding.NotifyOnValidationError = true;
  myBinding.NotifyOnSourceUpdated = true;

  myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

  myBinding.ValidationRules.Add(rule);
  MainTextBox.SetBinding(TextBlock.TextProperty, myBinding);

我错过了什么?

2 个答案:

答案 0 :(得分:4)

尝试设置绑定NotifyOnValidationError True ,默认为False:

  

获取或设置一个值,该值指示在验证错误时是否引发BindingValidationError事件。

示例:

<Binding NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged" ... />

此外,您可以看到ValidatesOnDataErrors属性,当您ViewModel实施IDataErrorInfo界面时,会使用该属性。

答案 1 :(得分:1)

放弃后面的代码绑定,我创建了一个绑定到xaml中的属性,然后在构造函数的代码后面,我将验证规则传递给构造函数并将其添加到验证规则中,如下所示: / p>

public GenericDialogBox(string MainLabelContent, string WindowTitle, string TextboxDefaultText, ValidationRule rule)
    {
      this.DataContext = this;
      Text = "";
      if (rule != null)
      {
        TextBoxValidationRule = rule;
      }
      InitializeComponent();
      MainLabel.Content = MainLabelContent;
      Title = WindowTitle;

      Binding binding = BindingOperations.GetBinding(MainTextBox, TextBox.TextProperty);
      binding.ValidationRules.Add(rule);


      MainTextBox.SelectAll();
      MainTextBox.Focus();
    }