0

i テキストが文字列データ型プロパティにバインドされているテキスト ボックスがあります。しかし、このテキスト ボックスには数値のみを入力する必要があります。

奇妙に見えますが、これは要件の 1 つです。同じテキスト ボックスは文字列と数値を受け入れることができます。テキスト ボックスを 2 つ取り、テキスト ボックスの可視性でこれを処理することはできません。

4

3 に答える 3

1

を使用してこれをかなりうまく行うことができますAttachedProperty

コントロールTextBoxProperties の添付プロパティで呼び出されるクラスがあります。TextBox

#region IsNumericOnly

/// <summary>
/// Provides the ability to restrict the text input of the TextBox control to only allow numeric values to be entered.
/// </summary>
public static readonly DependencyProperty IsNumericOnlyProperty = DependencyProperty.RegisterAttached("IsNumericOnly", typeof(bool), typeof(TextBoxProperties), new UIPropertyMetadata(default(bool), OnIsNumericOnlyChanged));

/// <summary>
/// Gets the value of the IsNumericOnly property.
/// </summary>
/// <param name="dependencyObject">The DependencyObject to return the IsNumericOnly property value from.</param>
/// <returns>The value of the IsNumericOnly property.</returns>
public static bool GetIsNumericOnly(DependencyObject dependencyObject)
{
    return (bool)dependencyObject.GetValue(IsNumericOnlyProperty);
}

/// <summary>
/// Sets the value of the IsNumericOnly property.
/// </summary>
/// <param name="dependencyObject">The DependencyObject to set the IsNumericOnly property value of.</param>
/// <param name="value">The value to be assigned to the IsNumericOnly property.</param>
public static void SetIsNumericOnly(DependencyObject dependencyObject, bool value)
{
    dependencyObject.SetValue(IsNumericOnlyProperty, value);
}

/// <summary>
/// Adds key listening event handlers to the TextBox object to prevent non numeric key strokes from being accepted if the IsNumericOnly property value is true, or removes them otherwise.
/// </summary>
/// <param name="dependencyObject">The TextBox object.</param>
/// <param name="dependencyPropertyChangedEventArgs">The DependencyPropertyChangedEventArgs object containing event specific information.</param>
public static void OnIsNumericOnlyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
    TextBox textBox = dependencyObject as TextBox;
    if (textBox != null)
    {
        bool newIsNumericOnlyValue = (bool)dependencyPropertyChangedEventArgs.NewValue;
        TextCompositionEventHandler textBox_PreviewTextInput = new TextCompositionEventHandler((s, e) => e.Handled = !e.Text.All(c => Char.IsNumber(c) && c != ' '));
        KeyEventHandler textBox_PreviewKeyDown = new KeyEventHandler((s, e) => e.Handled = e.Key == Key.Space);
        if (newIsNumericOnlyValue)
        {
            textBox.PreviewTextInput += textBox_PreviewTextInput;
            textBox.PreviewKeyDown += textBox_PreviewKeyDown;
        }
        else
        {
            textBox.PreviewTextInput -= textBox_PreviewTextInput;
            textBox.PreviewKeyDown -= textBox_PreviewKeyDown;
        }
    }
}

#endregion

次のように使用されます。

XML 名前空間を追加します。

xmlns:Attached="clr-namespace:Fully.Qualified.Namespace"

次に XAML:

<TextBox Text="{Binding YourString}" Attached:TextBoxProperties.IsNumericOnly="True" />

これは任意のものに適用できTextbox、数値以外の数字を入力することはできません。

于 2013-08-02T08:19:58.790 に答える
1

数値のみが必要な場合は、次のようにします。

  1. すべての文字が数値の場合、プロパティ セッター内で新しい値を検証します。
  2. その場合は、新しい値を設定します
  3. そうでない場合は、何もしないでください。

バインディングはゲッターとセッターを使用します。バインディングがプロパティのセッターを更新すると、そのゲッターが呼び出されます。TextBox とセッター内にテキストを入力すると、値は設定されません。テキストが入力されません。

代替手段は、ValidationRules を使用することです。

于 2013-08-02T08:11:11.670 に答える