【问题标题】:Numeric text box with MVVM Pattern带有 MVVM 模式的数字文本框
【发布时间】:2011-11-26 09:06:06
【问题描述】:

我已经看到了数字 TextBox 的实现,代码在 WPF 后面。我们如何在MVVM 模式中做到这一点?

【问题讨论】:

    标签: wpf mvvm mvvm-light


    【解决方案1】:

    在 WPF 中,如果您将 TextBox 绑定到 Decimal 或 Int 属性,它将只接受该 int 或 decimal,否则它将显示一个红色边框,表明它在绑定中没有正确的值。如果你在谈论数字 updown 文本框,那么它很容易通过 WPF 工具包通过here

    【讨论】:

      【解决方案2】:

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

      如果你想要一个数字文本框,你可以创建一个新的 TextBox 或 AttachedProperty 或一个 Behaviour。 Here 是 MaskedTextbox 行为的一个示例,可以理解我的意思。

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

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

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

      【讨论】:

      • 我在其中包含 MVVM 的原因是,我看到了在后面的代码中使用 Preview Key 事件的实现。我只是想消除那些答案
      【解决方案3】:

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

      ViewModel 将在该控件用于窗口或复合控件时出现。您可以将 Text 或 Numeric DependencyProperty 绑定到 ViewModel 中的公共属性。

      【讨论】:

        【解决方案4】:

        嗯...如果您想在数字文本框的文本属性更改时在视图模型中收到通知,只需绑定到它即可。如果数字文本框的 .Text 属性不是依赖属性,那就打编码器!

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

        我可以推荐,您可以通过以下方式从视图模型绑定到它:

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

        【讨论】:

          【解决方案5】:

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

          在您的设置器中,通过引发异常或删除非数字字符来拒绝非数字值。后一种方法的好处是适用于复制/粘贴操作,其中粘贴的文本可能包含数字和字母的混合,但只有数字必须保留。

          话虽如此,我同意其他建议,即使用仅公开数字属性的专用控件是一种更简洁的方法。

          问候,

          埃里克。

          【讨论】:

            猜你喜欢
            • 2016-08-23
            • 1970-01-01
            • 2012-12-27
            • 2019-01-27
            • 1970-01-01
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多