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

以下のコードで開始できます。これはユーザー コントロールであり、カスタム コントロールではありません。最初にコードをユーザー コントロールとして機能させてから、それをカスタム コントロールに変換することをお勧めします。ユーザー ワークフローを制御するビューモデル内のプロパティに有効なプロパティをバインドします。

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 に答える