1

我正在创建一个自定义控件,在 XAML 中调用该控件时可以将其设置为仅允许某些类型的输入:

<lib:CustomControl RestrictTo="UnsignedIntegersOnly" ... ></CustomControl>

UnsignedIntegersOnly 是包含一组允许限制的 Enum 的一部分。

如果用户输入了不允许的内容,控件将抛出验证错误并且不允许他继续到下一个表单/页面/等。

我实现这一点的愿景是,在构成此控件的基础 TextBox 中,将其文本字段绑定到一个验证规则,该验证规则将作为输入传递给在 CustomControl XAML 声明中指定的 RestrictTo 值。然后在该 ValidationRule 类中,处理 RestrictTo 特定验证并返回验证是否成功。

这是我不太确定如何进行的地方。是否有可能以这种看似动态的方式将参数传递给 ValidationRule?我正在设置我的控件的属性 RestrictTo,然后将其传递给它的验证。

如果可能,将如何实现?我应该使用哪种绑定或资源链接?

4

2 回答 2

1

您可能对使用 MaskedTextBox 控件感兴趣,它将限制用户可以在 TextBox 中输入的内容。

由于 Microsoft 没有对 WPF 进行官方控制,因此我建议 Xceed 提供以下内容:

MaskedTextBox(免费使用:-)

这里有掩码的语法:

http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <xctk:MaskedTextBox Mask="0000"></xctk:MaskedTextBox>
    </Grid>
</Window>

如果您有 Visual Studio 2012,您可以通过 NuGet 轻松获取此包:

(右键单击您的项目)

在此处输入图像描述

注意:在我对您上一个问题的回答中,我在发布的链接中广泛使用了验证规则,但我想说,如果有时您可以通过精心设计的组件/控件来避免它,那么它就是这样做是明智的。正如@Barn 在您之前的问题中指出的那样,通用验证规则可能很难做到,并且有些问题,因为您必须处理其中的所有类型,IMO 它有点违反直觉,因为验证器和转换器通常是特别反对成为通才;你可能会在它上面浪费更多的时间而不是它的价值,而且它的可重用性可能比你想象的要少。(来源:我的经验)

于 2013-07-11T14:42:03.013 回答
0

下面的代码应该可以帮助您入门。它是用户控件而不是自定义控件。我建议您首先将代码用作用户控件,然后将其转换为自定义控件。将 Valid 属性绑定到视图模型中控制用户工作流程的某些属性。

XAML:

<UserControl x:Class="WpfApplication.ValidatingControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" >
    <StackPanel Orientation="Horizontal">
        <TextBox Name="_textBox" TextChanged="OnTextChanged" Background="LightGray" Width="200"/>
        <TextBlock Name="_messageText" Foreground="Red" />
    </StackPanel>
</UserControl>

后面的代码:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication
{
    public partial class ValidatingControl : UserControl
    {
        public ValidatingControl()
        {
            InitializeComponent();
        }

        public enum Restrictions
        {
            UnsignedIntegersOnly,
            SmallIntegersOnly        
        }

        public static readonly DependencyProperty RestrictToProperty =
            DependencyProperty.Register("RestrictTo", typeof(Restrictions), typeof(ValidatingControl), new PropertyMetadata(Restrictions.UnsignedIntegersOnly));

        public Restrictions RestrictTo
        {
            get { return (Restrictions)GetValue(RestrictToProperty); }
            set { SetValue(RestrictToProperty, value); }
        }

        public bool Valid
        {
            get { return (bool)GetValue(ValidProperty); }
            set { SetValue(ValidProperty, value); }
        }

        public static readonly DependencyProperty ValidProperty =
            DependencyProperty.Register("Valid", typeof(bool), typeof(ValidatingControl), new UIPropertyMetadata(false));

        private void OnTextChanged(object sender, TextChangedEventArgs e)
        {
            ValidateText(RestrictTo, _textBox.Text);
        }

        private void ValidateText(Restrictions restrictTo, string text)
        {
            // validate text, update _messageText, update Valid 
        }
    }
}
于 2013-07-11T15:49:45.070 回答