Silverlight中的十进制转换器无法正常使用Lost Focus

时间:2012-08-22 12:18:28

标签: silverlight converters lostfocus

我在Silverlight中使用绑定。我已经使用Decimal实体绑定了TextBox。 以下是绑定的代码段。

<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();

一切都很好,但转换不会在失去焦点时被调用,当我在文本框中输入字符串时,不会调用转换,也不会将textBox文本转换为空白。

任何人都可以建议我,代码中的问题是什么。

提前致谢。 ----拉吉

3 个答案:

答案 0 :(得分:0)

根据你的描述,“转换不会在失去焦点时调用,当我在文本框中输入字符串时,不会调用转换,也不会将textBox文本转换为空白。”

这里,仅当与TextBox的Text属性的绑定发生更改时,才会调用Convert方法。因为,你提到Mode = TwoWay用于绑定,当你在文本框中输入任何文本时,将调用 ConvertBack方法,并且从这个方法返回的值将被分配给Source,在你的case,是SelectedEntity.Amount。

我不明白为什么我们需要显式编写GetBindingExpression(TextBox.TextProperty).UpdateSource();丢失焦点的代码以更新源。

理想情况下,既然你已经保持绑定模式两种方式,它应该在调用Converter的ConvertBack方法后更新源代码。 转换器代码对我来说没问题。

如果您需要更多详细信息或者我可能会误解某些内容,请告诉我们,请澄清这些问题。

答案 1 :(得分:0)

如果在TextChanged事件中手动更新绑定,请执行以下操作:

GetBindingExpression(TextBox.TextProperty).UpdateSource();

也许您在LostFocus事件中获得的值与您在TextChanged事件中更新的值不同!

所以,可能不会调用转换器,只是因为绑定中的值没有改变!

希望这有帮助!

答案 2 :(得分:0)

TwoWayTextChanged事件绑定的

LostFocus模式绝对不是最好的方法。如果绑定默认情况下,为什么在GetBindingExpression(TextBox.TextProperty).UpdateSource();中调用LostFocus?如果要手动更新绑定,请设置UpdateSourceTrigger=Explicit

无论如何你的转换器似乎很好,但我认为你不需要它。如果我理解正确,您希望清除文本,如果它不能转换为十进制。在这种情况下,您有几个选项,例如创建仅允许数字的自定义TextBox,或者您可以从Silverlight Toolkit检查NumericUpDown控件。我也发现了类似的问题here

如果您已安装Microsoft Expression Blend(如果没有,则可以从Microsoft Expression Blend Software Development Kit下载BlendSLSDK_en.msi),将System.Windows.Interactivity dll添加到您的项目并创建简单{{1像这样:

Behavior

并像

一样使用它
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;
    }
}