gpt4 book ai didi

Silverlight:您如何在自定义控件中实现验证?

转载 作者:行者123 更新时间:2023-12-04 17:12:52 25 4
gpt4 key购买 nike

如何在自定义控件中实现验证?我希望复制您会看到的标准验证逻辑,其中 TextBox 数据绑定(bind)到公开 IDataErrorInfo 或 INotifyDataErrorInfo 的模型或 View 模型。

最佳答案

要实现验证,您应该将“ValidationStates”组添加到控件的 VisualStateManager。

我将说明简单的自定义控件TestControlTestProperty属性(property)。

Generic.xaml 中的样式,根据状态显示带有第一条错误消息的蓝色文本或红色边框:

<Style TargetType="local:TestControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:TestControl">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ValidationStates">
<VisualState x:Name="Valid" />
<VisualState x:Name="InvalidFocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="InvalidBorder" Storyboard.TargetProperty="Visibility" Duration="0">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="InvalidUnfocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="InvalidBorder" Storyboard.TargetProperty="Visibility" Duration="0">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock Text="{TemplateBinding TestProperty}" Foreground="Blue" />
<Border x:Name="InvalidBorder" BorderBrush="Red" BorderThickness="2" Visibility="Collapsed">
<TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource TemplatedParent}}" Foreground="Red" FontWeight="Bold" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

有3种状态:
  • 有效 - 没有验证错误。
  • 无效焦点 - 当您将焦点设置到处于无效状态的控件时应用。默认控件在此状态下显示红色弹出窗口和红色边框,但在我的特定示例中,为简单起见,我不显示它。用户可以通过使用 Tab 键盘按钮或单击可聚焦的内部控件(如 TextBox)来调用此状态。
  • 无效未聚焦 - 当控件处于无效状态但未获得焦点时应用。

  • 这是控件的代码,它只包含一个属性:
    public class TestControl : Control
    {
    public TestControl()
    {
    this.DefaultStyleKey = typeof(TestControl);
    }

    public string TestProperty
    {
    get { return (string)GetValue(TestPropertyProperty); }
    set { SetValue(TestPropertyProperty, value); }
    }

    public static readonly DependencyProperty TestPropertyProperty =
    DependencyProperty.Register("TestProperty", typeof(string), typeof(TestControl), new PropertyMetadata(null));
    }

    之后,如果您使用 IDataErrorInfo ,正确的 xaml 是:
    <local:TestControl TestProperty="{Binding SomeModelProperty, ValidatesOnDataErrors=True}" />

    对于 INotifyDataErrorInfo ,正确的 xaml 甚至更简单:
    <local:TestControl TestProperty="{Binding SomeModelProperty}" />

    关于Silverlight:您如何在自定义控件中实现验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588126/

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