Jam*_*eet 5 c# validation wpf 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>
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法使用验证规则而不绑定到datacontext?
我正在尝试创建一个通用对话框,我可以将各种验证规则传递给.但是,我发现一段时间后,即使我在xaml中创建验证规则,它也无法正常工作.我读过我可以将TextBox的Text属性绑定到自身,但这不起作用.
但是,当我在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>
Run Code Online (Sandbox Code Playgroud)
所以我实际上设法通过在GenericDialogBox上绑定被调用的Text然后将Text属性绑定到Textbox的Text属性来使得xaml中的验证工作.但是,我似乎无法在后面的代码中使用相同的代码.
<TextBox.Text>
<Binding Path="Text" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<rules:IntegerValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
Run Code Online (Sandbox Code Playgroud)
但是当我在后面的代码中尝试这个时,它不起作用.
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);
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
放弃了从代码隐藏的绑定,我创建了一个到 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();
}
Run Code Online (Sandbox Code Playgroud)