gpt4 book ai didi

c# - WPF 如何在文本框中使用验证规则而不创建额外的属性以绑定(bind)到对话框中?

转载 作者:太空狗 更新时间:2023-10-29 23:14:56 26 4
gpt4 key购买 nike

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

     <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>

但是,有没有办法在不绑定(bind)到数据上下文的情况下使用验证规则?

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

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

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

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

 <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>

所以我实际上设法让验证在 xaml 中工作,方法是创建一个属性来绑定(bind) GenericDialogBox 上的调用 Text,然后将该 Text 属性绑定(bind)到文本框的 Text 属性。但是,我似乎无法在后面的代码中使用相同的代码。

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

我错过了什么?

最佳答案

尝试为您的绑定(bind)设置 NotifyOnValidationErrorTrue,默认为 False:

Gets or sets a value that indicates whether the BindingValidationError event is raised on validation errors.

例子:

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

您还可以看到 ValidatesOnDataErrors属性,他在您的 ViewModel 实现 IDataErrorInfo 时使用界面。

关于c# - WPF 如何在文本框中使用验证规则而不创建额外的属性以绑定(bind)到对话框中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com