【问题标题】:StringFormat, TextBox Validation and Caret PositionStringFormat、TextBox 验证和插入符号位置
【发布时间】:2012-05-02 17:52:36
【问题描述】:

我遇到了一个需要解决的问题。当某些事件发生时,我的 TextBox 的插入符号位置会重置为第一个字符。这是我的 TextBox 的 XAML,我的应用程序正在使用 MVVM:

<TextBox x:Name="txtAmount" Text="{Binding CurrentClientObject.Amount, Mode=TwoWay, StringFormat='###,###,##0.00'}"></TextBox>

绑定到模型属性:

private System.Nullable<decimal> _Amount; 
    [Display(ResourceType = typeof(MatchModelResx), Name = "LabelAmount", Description = "ToolTipAmount")] 
    public System.Nullable<decimal> Amount 
    { 
        get 
        { 
            return _Amount; 
        } 
        set 
        { 
            _Amount = value; 
            NotifyChanged("Amount"); 
        } 
    }

StringFormat 导致了这里的问题,因为每当我在 TextBox 中输入的字符串触发模型中的属性刷新时,就会应用 StringFormat 并且 TextBox 内的插入符号会移动

现在这不是问题,因为模型在 lostfocus 上刷新(UpdateSourceTrigger = 默认),但有时 TextBox 处于错误模式。如果用户输入的值违反了自定义验证规则,或者格式无效(即:在绑定到小数的字段中输入 64.5x5),则每次 keychange 都会触发模型中属性的刷新。并且由于模型刷新可能会导致应用 StringFormat,这意味着当用户尝试更正 TextBox 中的无效值时,插入符号将向左移动。这对我们的客户来说是一种恼人的行为,我们确实需要找到解决方法。

我尝试在绑定上使用自定义转换器而不是字符串格式,但这并不能解决问题。而且由于有时会在代码到达属性 Set 之前引发异常,因此我无法在插入符号移动之前处理此问题。

Silverlight 5 是否提供解决此问题的方法?

谢谢!

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    不确定您是否设置了 UpdateSourceTrigger=PropertyChanged,对于文本框,这会导致每次按下键并应用 StringFormat 时都会刷新,要解决此问题,应将其设置为“默认”,即 LostFocus

    http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多