StringFormat,TextBox验证和插入位置

时间:2012-05-02 17:52:37

标签: silverlight

我遇到了一个需要解决的问题。当某些事件发生时,我的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 = Default)上刷新,但是有一种情况是TextBox处于错误模式。如果用户输入的值打破了自定义验证规则,或者格式无效(即:在绑定到小数的字段中输入64.5x5),则每个keychange都会触发模型中属性的刷新。并且由于模型刷新可能导致应用StringFormat,这意味着当用户尝试更正TextBox中的无效值时,插入符号将向左移动。这对我们的客户来说是一种恼人的行为,我们真的需要找到解决方法。

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

不确定你是否设置了UpdateSourceTrigger = PropertyChanged,对于textbox这会导致每次按下Key和StringFormat时刷新,为了解决这个问题,它应该设置为“Default”,即LostFocus

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