Silverlight中的十进制转换器在失去焦点时无法正常工作

Silverlight中的十进制转换器在失去焦点时无法正常工作,silverlight,converters,lostfocus,Silverlight,Converters,Lostfocus,我正在Silverlight中使用绑定。我已经用十进制实体绑定了文本框。 下面是绑定的代码片段 <TextBox x:Name="AmountBox" Text="{Binding SelectedEntity.Amount,Mode=TwoWay,StringFormat=\{0:n2\},Converter={StaticResource DecimalBlankValueConverter}}" Validate="True" TextChanged="AmountBox_TextC

我正在Silverlight中使用绑定。我已经用十进制实体绑定了文本框。 下面是绑定的代码片段

<TextBox x:Name="AmountBox" Text="{Binding SelectedEntity.Amount,Mode=TwoWay,StringFormat=\{0:n2\},Converter={StaticResource DecimalBlankValueConverter}}" Validate="True" TextChanged="AmountBox_TextChanged" LostFocus="AmountBox_LostFocus"/> 关于失去焦点,我正在更新源 具有 GetBindingExpression(TextBox.TextProperty).UpdateSource()

一切正常,但在失去焦点时不会调用convert,当我在文本框中输入字符串时,不会调用convert,也不会将文本框文本转换为空白

谁能告诉我,代码中的问题是什么

提前谢谢。 ----Raj

根据您的描述,“在丢失焦点时不会调用convert,当我在文本框中输入字符串时,不会调用convert,它不会将文本框文本转换为空。”

这里,仅当TextBox的Text属性的绑定发生更改时,才会调用Convert方法。由于您提到了绑定的Mode=TwoWay,当您在textbox中输入任何文本时,将调用ConvertBack方法,并将从该方法返回的值分配给源,在您的情况下,该值为SelectedEntity.Amount

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

理想情况下,由于您保持了双向绑定模式,因此它应该在调用Converter的ConvertBack方法后更新源代码。 转换器代码在我看来还行


如果您需要更多详细信息或我可能误解了某些内容,请告诉我。如果您在TextChanged事件中手动更新绑定,请澄清这些问题,如:

GetBindingExpression(TextBox.TextProperty).UpdateSource();
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;
    }
}
您在LostFocus事件中获得的值可能与您在TextChanged事件中更新的值相同

因此,可能不会调用转换器,因为绑定中的值没有更改


希望这有帮助

two-way
模式绑定
TextChanged
LostFocus
事件肯定不是最好的方法。为什么要调用
GetBindingExpression(TextBox.TextProperty).UpdateSource()LostFocus
中的code>是否默认绑定?如果要手动更新绑定,请设置
UpdateSourceTrigger=Explicit

无论如何,你的转换器看起来不错,但我认为你不需要它。如果我理解正确,如果文本不能转换为十进制,您希望清除文本。在这种情况下,您有一些选项,比如创建只允许数字的自定义
文本框
,或者您可以从中选中
NumericUpDown
控件。我也发现了类似的问题

如果您已安装Microsoft Expression Blend
(如果未安装,您可以从下载
BlendLSDK_en.msi
),请将
System.Windows.Interactivity
dll添加到项目中,并创建简单的
行为
,如下所示:

GetBindingExpression(TextBox.TextProperty).UpdateSource();
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;
    }
}
公共类TextBoxClearTextBehavior:System.Windows.Interactivity.Behavior
{
受保护的覆盖无效附加()
{
AssociatedObject.LostFocus+=AssociatedObjectLostFocus;
base.onatached();
}
附加时受保护的覆盖无效()
{
AssociatedObject.LostFocus-=AssociatedObjectLostFocus;
base.OnDetaching();
}
private void AssociatedObjectLostFocus(对象发送方,System.Windows.routedEventTarget e)
{
小数结果;
如果(!decimal.TryParse(AssociatedObject.Text,输出结果))
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>
xmlns:i=“clr命名空间:System.Windows.Interactivity;assembly=System.Windows.Interactivity”
...    

当我在文本框中输入字符串时,我认为绑定给出了一个异常,因为我将它绑定到一个十进制值。所以转换器没有被调用。我想当我在文本框中输入字符串时,绑定会给出一个异常,因为我将它绑定到一个十进制值。所以转换器没有被调用。谢谢……我想当我在文本框中输入字符串时,绑定会给出一个异常,因为我将它绑定到一个十进制值。所以没有调用转换器。@user117323,不应该有任何异常,您可以在输出窗口中检查。
ConvertBack
方法是在您向
TextBox
输入一个值并返回Decimal后调用的。谢谢。我认为您是对的,但不知道为什么不调用convert