【发布时间】:2011-11-26 09:06:06
【问题描述】:
我已经看到了数字 TextBox 的实现,代码在 WPF 后面。我们如何在MVVM 模式中做到这一点?
【问题讨论】:
标签: wpf mvvm mvvm-light
我已经看到了数字 TextBox 的实现,代码在 WPF 后面。我们如何在MVVM 模式中做到这一点?
【问题讨论】:
标签: wpf mvvm mvvm-light
在 WPF 中,如果您将 TextBox 绑定到 Decimal 或 Int 属性,它将只接受该 int 或 decimal,否则它将显示一个红色边框,表明它在绑定中没有正确的值。如果你在谈论数字 updown 文本框,那么它很容易通过 WPF 工具包通过here
【讨论】:
老实说 - MVVM 和数字文本框有什么共同点?
如果你想要一个数字文本框,你可以创建一个新的 TextBox 或 AttachedProperty 或一个 Behaviour。 Here 是 MaskedTextbox 行为的一个示例,可以理解我的意思。
现在到您的 MVVM 部分。我假设你想验证你的输入只是数字。如果您的视图模型具有 int 类型的属性,那么如果您的视图获得可转换为 int 的输入,那么您的绑定就可以工作。否则将永远不会通知您的视图模型。现在有两种方法:
首先:确保视图只能接受数字输入(使用数字文本框),并且 viewmodel 属性可以是 int。
或第二个:您的视图模型属性类型是 typeof 字符串,并且您使用 IDataErrorInfo 让视图知道输入不是数字时。
【讨论】:
根据 MVVM 的标准定义,您不希望 ViewModel 位于自定义控件后面。您应该做的就是扩展 TextBox 控件并确保只输入数字输入。您还应该添加一个返回数字输入的 DependencyProperty。
ViewModel 将在该控件用于窗口或复合控件时出现。您可以将 Text 或 Numeric DependencyProperty 绑定到 ViewModel 中的公共属性。
【讨论】:
嗯...如果您想在数字文本框的文本属性更改时在视图模型中收到通知,只需绑定到它即可。如果数字文本框的 .Text 属性不是依赖属性,那就打编码器!
这个:http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&referringTitle=Home
我可以推荐,您可以通过以下方式从视图模型绑定到它:
<!-- View: -->
<NumericTextBox Text="{Binding MyViewModelTextStringProperty}" />
//ViewModel:
public string MyViewModelTextStringProperty
{
get/set with NotifyPropertyChanged....
}
【讨论】:
如果您真的想在 ViewModel 中执行此操作,则必须将绑定属性设为字符串。确保每次击键时绑定更新(使用UpdateSourceTrigger)。
在您的设置器中,通过引发异常或删除非数字字符来拒绝非数字值。后一种方法的好处是适用于复制/粘贴操作,其中粘贴的文本可能包含数字和字母的混合,但只有数字必须保留。
话虽如此,我同意其他建议,即使用仅公开数字属性的专用控件是一种更简洁的方法。
问候,
埃里克。
【讨论】: