【问题标题】:Textbox updates itself while typing输入时文本框会自行更新
【发布时间】:2018-03-22 15:23:48
【问题描述】:

我将以下文本框绑定到 MVVM ViewModel

文本框

<TextBox Height="71" Width="341" 
         Text="{Binding BalanceValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=N2}"
         Margin="0,2,2,2" HorizontalAlignment="Right"/>

下面是我的ImportPresenter,它处理输入。

Public Class ImportPresenter : ObservableObject
{
    private double _BalanceValue = 0;

    public double BalanceValue
    {
        get
        {
            return _BalanceValue;
        }
        set
        {
            _BalanceValue = double.Parse(value.ToString(), 
                            System.Globalization.NumberStyles.Currency);
            RaisePropertyChangedEvent("BalanceValue");
        }
    }//END BALANCEVALUE
}

在大多数情况下,这是有效的,除了在测试时,TextBox 在我打字时会自行更新。我应该为TextBox 使用不同的事件吗?

【问题讨论】:

  • 您希望它的表现如何?目前,您告诉 ViewModel 每次文本框的属性更改时更新,它会立即解析值、更新并通知视图属性已更改。您是希望它在您移除焦点时更新,还是在更新之前有延迟?
  • 我希望_BalanceValue 在用户输入完文本后更新
  • 为什么要在已经是 double 的值上使用 double.Parse?
  • 在这种情况下 - 我认为 Jack 在下面的回答是正确的。
  • 在属性设置器中,value 将与属性的类型相同。如果将鼠标悬停在它上面,您应该会看到类型。

标签: c# wpf xaml mvvm


【解决方案1】:

在某些情况下,在 LostFocus 和每个 PropertyChanged 上更新视图模型同样不方便。 (例如,输入关键字进行搜索 - 我们不想在每个字母之后运行搜索,我们希望在用户停止输入时执行此操作 - 但他们不会离开搜索字段)

由于 .net 4.5 Binding 类具有 Delay 属性(以毫秒为单位):

Text="{Binding BalanceValue, Mode=TwoWay, Delay=333, UpdateSourceTrigger=PropertyChanged, StringFormat=N2}"

为避免每次击键都更新源对象,请将 Delay 属性设置为一个合理的值,以使绑定仅在用户停止键入后经过该时间后才更新。

【讨论】:

  • 哇...这个真的很不错。这对我的一些自动保存程序有很大帮助。
【解决方案2】:

默认情况下,TextBox 的UpdateSourceTrigger 是Lost Focus。通过将其设置为PropertyChanged,它将针对所做的每个更改进行更新,例如每个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多