我在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文本转换为空白。
任何人都可以建议我,代码中的问题是什么。
提前致谢。 ----拉吉
答案 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)
TwoWay
和TextChanged
事件绑定的 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;
}
}