2

回避する必要がある問題があります。特定のイベントが発生すると、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"); 
        } 
    }

TextBox に入力した文字列がモデル内のプロパティの更新をトリガーするたびに、StringFormat が適用され、TextBox 内のキャレットが移動するため、StringFormat がここで問題を引き起こしています。

モデルは失われたフォーカス (UpdateSourceTrigger = Default) で更新されるため、これは問題になりませんが、TextBox がエラー モードの場合があります。ユーザーがカスタム検証規則に違反する値を入力した場合、または無効な形式 (つまり、10 進数にバインドされたフィールドに 64.5x5 を入力した場合) の値を入力した場合、キーを変更するたびにモデル内のプロパティの更新がトリガーされます。また、モデルの更新により StringFormat が適用される可能性があるため、ユーザーが TextBox の無効な値を修正しようとしている間、キャレットが左に移動することを意味します。これはお客様にとって苛立たしい行為であり、回避する方法を見つける必要があります。

stringformat の代わりにバインディングでカスタム コンバーターを使用してみましたが、問題は解決しません。また、コードがプロパティ Set に到達する前に例外が発生することがあるため、キャレットが移動する前にこれを処理する方法がありません。

Silverlight 5 はこれを回避する方法を提供していますか?

ありがとう!

4

1 に答える 1

0

UpdateSourceTrigger=PropertyChanged を設定したかどうかは不明です。これにより、キーを押すたびにテキストボックスが更新され、StringFormat が適用されます。これを修正するには、LostFocus である「デフォルト」に設定する必要があります。

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

于 2014-05-05T09:41:31.337 に答える