4

我最近一直在MVVM Light中开发一个应用程序。我的XAML中有一个TextBox绑定到我的UI。我想验证任何输入并确保只输入数字。我试过以下代码:

我的文本框

<TextBox TabIndex="1" Height="23" MinWidth="410" DockPanel.Dock="Left" 
         HorizontalAlignment="Left"
         Text="{Binding Input, UpdateSourceTrigger=PropertyChanged}" 
         IsEnabled="{Binding IsEnabled}"
         AcceptsReturn="False"
         local:FocusExtension.IsFocused="{Binding IsFocused}">

在我的 ViewModel 中:

private string input;
public string Input
{
    get { return this.input; }
    set
    {
        decimal test;
        if(decimal.TryParse(value, out test))
        {
            this.input = value;
        }
        else
        {
            this.input = "";
        }

        RaisePropertyChanged("Input");
    }
}

这无法更新UI。如果我输入“B”并检查调试器,它会通过设置器运行,但实际上无法更新UI

奇怪的是,如果我this.input = "TEST";在 else 块中设置UI更新,但是,如果我尝试将其设置为""string.Empty或验证之前的输入值,则UI无法更新。

这是设计使然吗?可能是一个错误?有什么我做错了吗?

编辑我错误地忘记包含RaisePropertyChanged在我的示例代码中。我已经更新了它。提升它不是问题,因为我已经看到调试器一直运行通过提升它并通过 getter 返回输入。

4

2 回答 2

0

我们所做的是创建了一个自定义控件,因为我们将它用于货币文本框。我警告你我没有验证这是一个好主意,或者符合 MVVM 模型,因为所有控件的操作都是在后面的代码中完成的。

在文本框的控件中,我们在 PreviewTextInput 上有一个执行此操作的事件

e.Handled = Functions.DoubleConverter(Convert.ToChar(e.Text), ((TextBox)sender).Text.Replace("$", ""));

然后对于功能(这并不完美,我仍然有一些问题)是:

static public bool DoubleConverter(char c, string str)
{
    if (!char.IsDigit(c))
    {
        if (c == '.' && (str.Contains('.')))
        {
            return true;
        }
        else if (c != '.')
        {
            return true;
        }
    }
    return false;
}

请将此作为参考,而不是完全按照原样使用,因为它是一个非常粗略的实现。

于 2013-11-02T19:07:51.877 回答
0

使用 strign 类型属性然后转换为十进制的方式,更容易更改,如下所示:

public decimal Input
{
    get { return this.input; }
    set 
        { 
          this.input = value;
         RaisePropertyChanged("Input");
      } 
}

并为验证使用 IDataErrorInfo(阅读更多:http: //blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx

于 2013-11-01T20:24:35.410 回答