RaisePropertyChanged无法更新UI

4

最近我一直在使用 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将更新,但是,如果我尝试将其设置为""string.Empty或验证之前的输入值,则UI将无法更新。

这是否是设计上的问题?可能是个bug吗?我做错了什么吗?

编辑 我错误地忘记在示例代码中包括RaisePropertyChanged。我已经更新了代码。唤起它不是问题,因为我观察调试器一直运行唤起它并通过getter返回input。


3
你实际上没有触发 OnPropertyChanged。这个类实现了 IPropertyChanged 接口吗? - Mike Perrenoud
@neoistheone 我正在使用 RaisePropertyChanged。我不小心忘了将其放入问题中的代码中。 - DanteTheEgregore
这个问题有没有被解决?我和你的情况完全相同,可以确认你提出的每一个点。 - Golvellius
2个回答

0

所有的观点都很好,但是1. 没有真正回答问题,2. 这不会显示为空,这可能是操作者想要的。 - UIlrvnd
@StefanDenchev 就像你所说的那样,我宁愿清除文本框。这个答案提出了很多好的观点,但是最终,我不能将绑定更改为十进制,因为我需要稍后将其回收以用于非数字输入。 - DanteTheEgregore

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;
}

请将此作为参考,而不是完全照搬,因为这只是一个非常粗糙的实现。

我看不出这个回答为什么 RaisPropertyChanged() 在我的 setter 中无法更新 UI。 :c - DanteTheEgregore
抱歉,我曾经花了好几天的时间试图解决这个问题,但一直没有成功,所以这是我能想到的最好的解决方案。希望有人知道原因。 - Daryl Behrens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接