1

Silverlight でバインディングを使用しています。TextBox を Decimal エンティティにバインドしました。以下は、バインディングのコード スニペットです。

<TextBox x:Name="AmountBox" Text="{Binding SelectedEntity.Amount,Mode=TwoWay,StringFormat=\{0:n2\},Converter={StaticResource DecimalBlankValueConverter}}" Validate="True" TextChanged="AmountBox_TextChanged" LostFocus="AmountBox_LostFocus"/>

以下はコンバーターコードです。

    decimal result;
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {            
        if (!Decimal.TryParse(value.ToString(),out result) || (decimal)value == decimal.Zero)
            return null;
        return decimal.Parse(value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !Decimal.TryParse(value.ToString(), out result))
            return 0.00;
        return decimal.Parse(value.ToString());
    }

フォーカスが失われた場合、ソースを GetBindingExpression(TextBox.TextProperty).UpdateSource(); で更新しています。

すべてがうまく機能していますが、フォーカスが失われたときに convert が呼び出されず、テキストボックスに文字列を入力すると、convert が呼び出されず、textBox テキストが空白に変換されません。

誰でも私に提案してもらえますか、コードの問題は何ですか。

前もって感謝します。----ラージ

4

3 に答える 3

0

TwoWayTextChangedイベントとのモードバインディングは、LostFocus間違いなく最良のアプローチではありません。if バインディングをデフォルトで呼び出すGetBindingExpression(TextBox.TextProperty).UpdateSource();のはなぜですか? LostFocusバインディングを手動で更新する場合は、 を設定しUpdateSourceTrigger=Explicitます。

とにかく、コンバーターは問題ないようですが、必要ないと思います。私の理解が正しければ、テキストを 10 進数にキャストできない場合は、テキストをクリアする必要があります。その場合、TextBox数字のみを許可するカスタムを作成するか、 Silverlight ToolkitNumericUpDownから制御を確認するなど、いくつかのオプションがあります。また、同様の質問hereを見つけました。

インストールしている場合Microsoft Expression Blend(そうでない場合は、Microsoft Expression Blend Software Development KitBlendSLSDK_en.msiからダウンロードできます)、プロジェクトに dll を追加し、次のように簡単に作成します。System.Windows.InteractivityBehavior

public class TextBoxClearTextBehavior : System.Windows.Interactivity.Behavior<System.Windows.Controls.TextBox>
{
    protected override void OnAttached()
    {
        AssociatedObject.LostFocus += AssociatedObjectLostFocus;
        base.OnAttached();
    }

    protected override void OnDetaching()
    {
        AssociatedObject.LostFocus -= AssociatedObjectLostFocus;
        base.OnDetaching();
    }

    private void AssociatedObjectLostFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        decimal result;
        if (!decimal.TryParse(AssociatedObject.Text, out result))
            AssociatedObject.Text = string.Empty;
    }
}

そしてそれを次のように使用します

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

...    

<TextBox Text="{Binding Amount, Mode=TwoWay, StringFormat=\{0:n2\}}">
    <i:Interaction.Behaviors>
        <Behavior:TextBoxClearTextBehavior/>
    </i:Interaction.Behaviors>
</TextBox>
于 2012-08-22T14:16:40.567 に答える
0

あなたの説明によると、「フォーカスが失われたときに変換が呼び出されず、テキストボックスに文字列を入力しているときに、変換が呼び出されず、テキストボックスのテキストが空白に変換されません。」

ここで、Convert メソッドは、TextBox の Text プロパティとのバインディングが変更された場合にのみ呼び出されます。バインドに Mode=TwoWay を指定したため、テキストボックスにテキストを入力すると、ConvertBack メソッドが呼び出され、このメソッドから返された値がソース (この場合は SelectedEntity.Amount) に割り当てられます。

GetBindingExpression(TextBox.TextProperty).UpdateSource(); を明示的に記述する必要がある理由がわかりません。ソースを更新するために失われたフォーカスのコード。

理想的には、バインド モードを Two way のままにしておいたので、Converter の ConvertBack メソッドを呼び出した後にソースを更新する必要があります。コンバーターコードは私には問題ないようです。

詳細が必要な場合、または誤解している可能性がある場合はお知らせください。それらの点を明確にしてください。

于 2012-08-22T13:21:59.233 に答える
0

次のように、TextChanged イベントのバインディングを手動で更新する場合:

GetBindingExpression(TextBox.TextProperty).UpdateSource();

おそらく、LostFocus イベントで取得する値は、TextChanged イベントで更新した値と変わらないでしょう!

したがって、バインディングの値が変更されていないという理由だけで、おそらくコンバーターは呼び出されません!

お役に立てれば!

于 2012-08-22T13:26:44.497 に答える