所以我有一个在这里工作的例子:
<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>
但是,有什么方法可以使用验证规则而不绑定到数据上下文?
我正在尝试制作一个通用对话框,可以将各种验证规则传递给该对话框。但是,一段时间后,我发现即使在xaml中创建验证规则时,它也无法正常工作。我已经读过我可以将TextBox的Text属性绑定到自身,但这是行不通的。
但是,当我在ValidationRule中放置一个断点时,似乎在插入数据时在正确的位置调用了该断点。另外,由于背景为蓝色,因此样式似乎可以正常工作。这使我相信Validation.HasError永远不会变为真实,或者变得真实,并且变回如此之快,以至于我看不到变化。
我输入的每个字母后都会调用验证规则,但文本框不会更新为显示haserror = true。为什么是这样?
是否只允许我将属性绑定到自身?有没有其他方法可以使用没有绑定的验证规则,还是我总是必须创建一个额外的属性来绑定?最简单的解决方法是创建一个额外的text属性并将其毫无意义地绑定,但是我希望这不是必需的。
<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);
我想念什么?
从后面的代码放弃绑定,我在xaml中创建一个到属性的绑定,然后在后面的构造函数的代码中,我将传递给构造函数的验证规则添加到构造函数中,如下所示:
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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句