【问题标题】:Error message in a property属性中的错误消息
【发布时间】:2015-08-19 09:14:55
【问题描述】:

这是我的问题。如果用户在文本框中键入数字是可以的,但如果他键入字符,我在属性中看不到 messagebox()。 为什么?

<TextBox HorizontalAlignment="Left" 
         TabIndex="12" 
         Text="{Binding Time_HH, UpdateSourceTrigger=PropertyChanged,StringFormat='{}{##}'}" 
         FlowDirection="RightToLeft"  
         MaxLength ="2" 
         Height="30" 
         Width="30" />

这就是属性

Private _Time_HH As Integer

Public Property Time_HH() As Integer
    Get
        Return _Time_HH
    End Get
    Set(value As Integer)
        For i = 0 To Len(value.ToString)
            If IsNumeric(value.ToString(i)) = False Then
                MessageBox.Show("Error")
                value = 0
            End If
        Next

        _Time_HH = value
        OnPropertyChanged("Time_HH")
    End Set
End Property

【问题讨论】:

  • value as Integer 然后 value.ToString() 整数不可能包含字符而不是数字(符号的一部分)。

标签: wpf vb.net data-binding properties


【解决方案1】:

您的Time_HH 属性是一个整数,它不可能包含非数字字符。

最多会发生什么情况是您的 Binding 由于类型不匹配而失败(您的 TextBox 是否显示红色轮廓?)

如果你想检查你的用户是否输入了非数字字符,你必须使用允许这样的类型:字符串。

试试这个:

Private _Time_HH As Integer
Public Property Time_HH() As String
    Get
        Return _Time_HH.ToString()
    End Get
    Set(value As String)
        For i = 0 To Len(value)
            If IsNumeric(value.ToString(i)) = False Then
                MessageBox.Show("Error")
                value = 0
            End If
        Next

        _Time_HH = Integer.Parse(value)
        OnPropertyChanged("Time_HH")
    End Set
End Property

如果您需要使用数值,请使用整数字段。如果您想将它用于另一个 Binding 或类似的东西,您可以创建一个 Integer 类型的第二个属性,它只是公开该字段(请记住也为该属性提高OnPropertyChanged,然后在Time_HH setter 上)

注意 - 如果用户键入“00,01-2,0”之类的内容,上述代码将引发异常。 IsNumeric 为该字符串中的所有字符返回 True,但这并不意味着它是正确的数字。

在我看来,这样做会更好:

Private _Time_HH As Integer
Public Property Time_HH() As String
    Get
        Return _Time_HH.ToString()
    End Get
    Set(value As String)
        Dim int As Integer

        If Integer.TryParse(value, int) = False Then
            MessageBox.Show("Error")
        End If

        _Time_HH = int
        OnPropertyChanged("Time_HH")
    End Set
End Property

对不起,如果我犯了一些错误,我通常用 C# 编写代码,而我的 VB 很生疏:P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多