2012-05-02 2 views
2

У меня проблема, мне нужно работать. Позиция каретки моего TextBox сбрасывается на первый символ, когда происходят определенные события. Вот XAML для моего TextBox, мое приложение использует MVVM:StringFormat, Validation и Caret Position

<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 вызывает проблему здесь, так как всякий раз, когда строка ввода I в TextBox запускает обновление свойства в модели, применяется StringFormat и перемещается курсор внутри TextBox.

Теперь это не представляет проблемы, так как модель обновляется на lostfocus (UpdateSourceTrigger = Default), но там это случай, когда TextBox в режиме ошибки. Если пользователь либо вводит значение, которое нарушает правило пользовательской проверки, либо находится в недопустимом формате (то есть: вводит 64.5x5 в поле, привязанное к десятичной системе), каждый отдельный ключ запускает обновление свойства в модели. И поскольку обновление модели может привести к применению StringFormat, это означает, что каретка будет перемещаться влево, пока пользователь пытается исправить недопустимое значение в TextBox. Это раздражающее поведение для наших клиентов, и нам действительно нужно найти путь вокруг него.

Я попытался использовать собственный конвертер для привязки вместо строкового формата, но это не устраняет проблему. И поскольку исключение иногда возникает до того, как код достигнет набора свойств, у меня нет способа справиться с этим до того, как карет перемещается.

Предлагает ли Silverlight 5 возможность обойти это?

Спасибо!

ответ

0

Не уверен, что если вы установили UpdateSourceTrigger = PropertyChanged, для текстового поля это приводит к тому, обновления каждый раз, когда вы нажимаете ключ и StringFormat применяется, чтобы исправить это должно быть установлено значение «по умолчанию», который LostFocus

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

Смежные вопросы