MVVM模式的数字文本框

时间:2011-09-27 20:33:01

标签: wpf mvvm mvvm-light

我见过TextBox后面带有代码的数字WPF的实现。我们如何以MVVM模式执行此操作?

5 个答案:

答案 0 :(得分:5)

老实说 - MVVM和数字文本框有什么共同之处?

如果您需要数字文本框,则可以创建新的TextBox或AttachedProperty或Behavior。 Here是MaskedTextbox行为的示例,可以看出我的意思。

现在到你的MVVM部分。我假设您要验证您的输入只是数字。如果你的viewmodel有一个int类型的属性,那么你的绑定只有在你的视图得到可转换为int的输入时才能工作。否则您的视图模型将永远不会被通知。现在有两种方法:

首先:确保您的视图可以使用数字输入(使用数字文本框),并且viewmodel属性可以是int。

或第二:您的viewmodel属性类型是typeof字符串,并且您使用IDataErrorInfo让视图知道输入何时不是数字。

答案 1 :(得分:4)

在WPF中,如果将TextBox绑定到Decimal或Int属性,它将只接受该int或decimal,否则它将显示一个红色边框,表示它在绑定中没有正确的值。如果您正在讨论数字更新文本框,那么它可以通过here上的WPF工具包轻松获得

答案 2 :(得分:1)

根据MVVM的标准定义,您不希望自定义控件背后的ViewModel。您应该做的就是扩展TextBox控件并确保只输入数字输入。您还应该添加一个返回数字输入的DependencyProperty。

当窗口或复合控件中使用该控件时,ViewModel会进入。您可以将Text或Numeric DependencyProperty绑定到ViewModel中的公共属性。

答案 3 :(得分:0)

嗯...如果您希望在数字文本框的text属性发生更改时通知您的viewmodel,只需绑定它。如果数字文本框的.Text属性不是依赖属性,则使用编码器!

这一个:http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&referringTitle=Home

我可以推荐,您可以通过以下方式从viewmodel绑定到它:

<!-- View: -->
<NumericTextBox Text="{Binding MyViewModelTextStringProperty}" />
//ViewModel:
public string MyViewModelTextStringProperty
{
  get/set with NotifyPropertyChanged....
}

答案 4 :(得分:0)

如果您真的想在ViewModel中执行此操作,则必须使绑定属性成为字符串。确保每次击键时绑定更新(使用UpdateSourceTrigger)。

在您的setter中,通过引发异常或修剪非数字字符来拒绝非数字值。后一种方法有利于复制/粘贴操作,其中粘贴的文本可能包含数字和字母的混合,但只有数字必须保留。

话虽如此,我同意其他建议,即只有一个专门的控件才能公开数字属性是一种更清洁的方法。

此致

埃里克。