2014-11-04 3 views
1

В приложении Windows Store с использованием MVVM У меня есть текстовое поле с двусторонней привязкой, которое должно допускать только числовые значения. Какова надлежащая процедура с использованием MVVM, чтобы просто игнорировать при нажатии непиксельной клавиши?Проверка ввода в приложении для магазина Windows

Значение, измененное в INotifyPropertyChanged, срабатывает только тогда, когда текстовое поле теряет фокус. Мне в основном нужна мгновенная проверка для моих свойств. Я не могу найти простой пример этого.

ответ

2

Почему бы не создать прикрепленное свойство, чтобы скрыть это поведение? Что-то вроде этого:

public class TextBoxHelper 
{ 
    public static bool GetRestrictToNumerical(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(RestrictToNumericalProperty); 
    } 

    public static void SetRestrictToNumerical(DependencyObject obj, bool value) 
    { 
     obj.SetValue(RestrictToNumericalProperty, value); 
    } 

    public static readonly DependencyProperty RestrictToNumericalProperty = 
     DependencyProperty.RegisterAttached("RestrictToNumerical", typeof(bool), typeof(TextBoxHelper), new PropertyMetadata(false, onRestrictToNumericalChanged)); 

    private static void onRestrictToNumericalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var tb = d as TextBox; 
     if (tb == null) 
      return; 

     if ((bool)e.NewValue) 
      tb.KeyDown += tb_KeyDown; 
     else 
      tb.KeyDown -= tb_KeyDown; 
    } 

    static void tb_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e) 
    { 
     e.Handled = e.Key < VirtualKey.Number0 || e.Key > VirtualKey.Number9; 
    } 
} 

Вы бы использовать его в XAML как это:

<Page 
    x:Class="App4.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App4" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <TextBox VerticalAlignment="Center" local:TextBoxHelper.RestrictToNumerical="True" InputScope="Number" /> 
    </Grid> 
</Page> 

This, на мой взгляд, это чистый MVVM подход для всех входных валидаций, что вы могли бы должны быть сделаны. Вероятно, это слишком сложно для вашего простого вопроса, но он подходит для более сложных проверок.

Смежные вопросы