Silverlight中的十进制转换器在失去焦点时无法正常工作
我正在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方法后更新源代码。 转换器代码在我看来还行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
如果您需要更多详细信息或我可能误解了某些内容,请告诉我。如果您在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