使用 MVVM 设计模式在代码隐藏中使用文本框粘贴事件?
Using Textbox pasting event in Code Behind with MVVM Design Pattern?
所以我是 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 中吗?
恕我直言,更简洁的方法是使用 INotifyDataErrorInfo
或 ValidationRule
它们在验证方案中都有自己的位置。 INotifyDataErrorInfo
更紧密地绑定到类型,而 ValidationRule
松耦合以验证实例。
这里有一些关于如何使用的信息Validation Rules and INotifyDataErrorInfo
所以我是 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 中吗?
恕我直言,更简洁的方法是使用 INotifyDataErrorInfo
或 ValidationRule
它们在验证方案中都有自己的位置。 INotifyDataErrorInfo
更紧密地绑定到类型,而 ValidationRule
松耦合以验证实例。
这里有一些关于如何使用的信息Validation Rules and INotifyDataErrorInfo