我见过TextBox
后面带有代码的数字WPF
的实现。我们如何以MVVM
模式执行此操作?
答案 0 :(得分:5)
如果您需要数字文本框,则可以创建新的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中,通过引发异常或修剪非数字字符来拒绝非数字值。后一种方法有利于复制/粘贴操作,其中粘贴的文本可能包含数字和字母的混合,但只有数字必须保留。
话虽如此,我同意其他建议,即只有一个专门的控件才能公开数字属性是一种更清洁的方法。
此致
埃里克。