在MVVM设计模式背后的代码中使用文本框粘贴事件?

时间:2018-08-20 23:33:14

标签: c# wpf mvvm code-behind

因此,我是WPF中流行的MVVM设计模式的新手。我有一个文本框,我只想接受数字输入。当前,我的用户控件已将DataContext设置为我的ViewModel。我的问题是,下面的代码是否也应该在ViewModel中,还是按照MVVM设计模式将其包含在用户控件(视图)中?

private static readonly Regex num = new Regex("[^0-9.-]+");

private void ValidationEvent(object sender, TextCompositionEventArgs e)
{
    e.Handled = num.IsMatch(e.Text);
}

private void PastingEvent(object sender, DataObjectPastingEventArgs e)
{
    if (e.DataObject.GetDataPresent(typeof(String)))
    {
        if (num.IsMatch((String)e.DataObject.GetData(typeof(String))))
        {
            e.CancelCommand();
        }
    }
    else
    {
        e.CancelCommand();
    }
}

这些事件在我的视图中像这样绑定到文本框:

<TextBox Text="{Binding Number}" DataObject.Pasting="PastingEvent" PreviewTextInput="ValidationEvent" Width="70" Margin="5 5 10 5" Style="{StaticResource PlaceHolderTextBox}" />

根据最佳实践,所有这些都应该在关联的ViewModel中吗?

1 个答案:

答案 0 :(得分:1)

恕我直言,一种更清洁的方法是使用INotifyDataErrorInfoValidationRule

它们在验证方案中都有自己的位置。 INotifyDataErrorInfo与该类型绑定更紧密,而ValidationRule则松散地耦合以验证实例。

以下是有关如何使用Validation RulesINotifyDataErrorInfo的一些信息