wpf在绑定项上捕获带有字符串格式N2的文本框的无效输入

时间:2016-07-09 14:30:16

标签: wpf xaml

这可能是一个简单的答案,但我似乎无法找到它。我的窗口上有一个文本框,它与二进制属性绑定。我有字符串格式= N2以确保有效输入。这是我的xaml:

 <TextBox x:Name="tbxAmount"
             Text="{Binding ItemAmount, StringFormat=N2, Mode=TwoWay}"
             HorizontalAlignment="Left"
             Height="23" .....

验证效果很好 - 如果输入无效,则文本框以红色标出,并且绑定类中的属性不会更改。但...

有一个SAVE按钮,然后将对类属性所做的更改保存到我的数据库中。不知何故,在SAVE按钮单击事件中,我需要识别出我的文本框输入无效,因此阻止了数据库更新。必须有一个属性指示我可以引用的文本框上的格式错误,或者我需要做些什么来防止保存?

4 个答案:

答案 0 :(得分:1)

所有这些答案都很棒。验证课程让我走上了正确的道路,以解决目前最适合我的方式。

在我的保存点击事件中,我当前在我的项类中运行了一个验证函数,如果有任何验证错误,它会返回一系列消息。然后,如果消息不是空白,则显示错误消息,而不是继续保存功能。

所以我需要做的就是检查GetHasError的结果以获取tbx数量,并包含另一条错误消息,如果它是真的。这是我的Click事件的相关代码...... (VB中的代码,保存“;”s)

 Private Sub btnSave_Click(sender As Object, e As RoutedEventArgs) Handles btnSave.Click
    Dim tErrors As String = ""
    'validate
    tErrors = sInvoiceItem.InvoiceItemVerify()
    If Validation.GetHasError(tbxAmount) = True Then
        tErrors = tErrors + "The amount entered must be a valid number." + Environment.NewLine
    End If

    If tErrors = Nothing Then ' proceed with save
        ....

所以我的关键是Validation.GetHasError()函数。感谢大家的投入。

将来,我想更多地使用ViVi和qqww2上面的解决方案来保持XAML中的验证,但是我不确定如何向用户添加消息/反馈的显示。

同样,罗伯特上面的回答解决了防止无效数据被保存的问题,但我不希望让项目类本身向用户发出消息。

答案 1 :(得分:0)

您寻求的财产是func setUpAirPlayView() { //Airplay Button if self.airPlay_PlayBtn == nil { let playImage = UIImage(named: "player_play.png")! if let _ = self.airPlay_PlayBtnFrame { self.airPlay_PlayBtn = UIButton(frame: self.airPlay_PlayBtnFrame) self.airPlay_PlayBtn.setBackgroundImage(playImage, forState: UIControlState.Normal) self.airPlay_PlayBtn.addTarget(self, action: #selector(ICFPlayerViewController.airPlayButtonAction), forControlEvents: UIControlEvents.TouchUpInside) self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_play.png"), forState: .Normal) self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_pause.png"), forState: .Selected) self.airPlay_PlayBtn.center = self.view.center self.view.addSubview(self.airPlay_PlayBtn) if let _ = self.player { self.player.playPauseButton.hidden = true } } } else { self.airPlay_PlayBtn.hidden = false if let _ = self.player { self.player.playPauseButton.hidden = true } } // Airplay Label if self.airPlayLabel == nil { self.airPlayLabel = UILabel() self.airPlayLabel.frame = CGRectMake(0, 0, 280, 20) self.airPlayLabel.text = "Your video is now playing on Apple TV" self.airPlayLabel.textAlignment = NSTextAlignment.Center self.airPlayLabel.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.6) self.airPlayLabel.textColor = UIColor.whiteColor() self.airPlayLabel.sizeToFit() self.airPlayLabel.center = self.view.center self.airPlayLabel.center.y = self.view.center.y - self.activityIndicator.frame.size.height*1.5 self.view.addSubview(self.airPlayLabel) } else { self.airPlayLabel.hidden = false } // Thumbnail self.setupContentThumbnailImageView() //Fetch Thumbnail image if let _ = self.thumbnailImage { self.view.addSubview(self.thumbnailImage) } self.view.bringSubviewToFront(bottomToolbar) self.view.bringSubviewToFront(topToolbar) if let _ = self.airPlayLabel { self.view.bringSubviewToFront(self.airPlayLabel) } if let _ = self.airPlay_PlayBtn { self.view.bringSubviewToFront(self.airPlay_PlayBtn) } } 附加财产。当输入无效时,您可以使用此属性禁用按钮。

Validation.HasError

<Window.Resources> <local:NegateBooleanConverter x:Key="NegateBooleanConverter"/> </Window.Resources> <Button IsEnabled="{Binding ElementName=tbxAmount, Path=(Validation.HasError), Converter={StaticResource NegateBooleanConverter}}"/> Validation.HasError true应为IsEnabled时,反之亦然。因此应该否定绑定。您可以通过简单的转换器实现此目的:

false

答案 2 :(得分:-1)

你可以使用Contain方法来检查文本是否匹配,请检查以下代码:

    private void button_Click(object sender, RoutedEventArgs e)
    {
        if (textBox.Text.Contains(N2))
        {
            MessageBox.Show("Item match");
        }
        else
        {
            MessageBox.Show("Item does not match");
        }
    }

答案 3 :(得分:-2)

不是检查无效数据,而是为什么不首先阻止数据设置为无效值?

在您要绑定的属性中,使用'set'方法检查值并在允许之前对其进行格式化。

我已经猜到了你的代码,但想象这样的东西会起作用。这是我用来从文本框中获取数值并确保格式正确的方法。

private double itemAmount;
public string ItemAmount
{
    get
    {
        return itemAmount.ToString("N2");
    }
    set
    {
        double temp = 0;

        if(Double.TryParse(value, out temp))
        {
            itemAmount = temp;
        }
    }
}