RaisePropertyChanged无法更新UI

时间:2013-11-01 19:36:53

标签: c# wpf xaml mvvm mvvm-light

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

我的 TextBox

<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”并检查调试器,它将通过setter运行,但无法实际更新 UI

奇怪的是,如果我在else块中设置this.input = "TEST";UI会更新,但是,如果我尝试将其设置为“”,则为字符串。清空或验证前的输入值, UI 无法更新。

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

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

2 个答案:

答案 0 :(得分:0)

你使用字符串类型属性,然后转换为十进制,更容易改变这个:

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

答案 1 :(得分: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;
}

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