C# 在失去焦点事件之前,是否有任何方法执行Textbox UpdateSourceTrigger=LostFocus?
我有一个C# 在失去焦点事件之前,是否有任何方法执行Textbox UpdateSourceTrigger=LostFocus?,c#,wpf,data-binding,lost-focus,updatesourcetrigger,C#,Wpf,Data Binding,Lost Focus,Updatesourcetrigger,我有一个TextBox,在执行LostFocus事件之前,必须更新其中的Text属性,因为在LostFocus事件中,我使用Text属性的值进行计算 当前,在输入LostFocus事件(TXTOTAISNFE_LostFocus)时,ThisDataContext.descOnTotal的值尚未更新 p.S:我不能使用UpdateSourceTrigger=PropertyChanged,因为我在WPF中使用了一个转换器(PriceConverter1),只有在文本框中输入完整的值后才能执行。它
TextBox
,在执行LostFocus
事件之前,必须更新其中的Text
属性,因为在LostFocus
事件中,我使用Text
属性的值进行计算
当前,在输入LostFocus
事件(TXTOTAISNFE_LostFocus
)时,ThisDataContext.descOnTotal
的值尚未更新
p.S:我不能使用UpdateSourceTrigger=PropertyChanged
,因为我在WPF中使用了一个转换器(PriceConverter1
),只有在文本框中输入完整的值后才能执行。它将输入的值转换为2个十进制值(即,在运行LostFocus
时)
问题是:在.NET进程队列中是否有任何方法可以理解它必须首先从UpdateSourceTrigger
运行LostFocus
,然后运行LostFocus
(txttotainsfeu LostFocus
)
WPF代码(descontotal=ThisDataContext.descon)
:
PriceConverter1代码(请忽略此代码中的最佳实践):
直接使用事件很麻烦。您可以通过dispatcher将某些内容排入队列来解决此问题,但一般来说,请查看MVVM,分离视图和视图模型,使用绑定/命令,不要将任何计算放入视图中。既然您已经绑定了,为什么要使用lostfocus之类的事件?当用户弹出选项卡时,该值将传递到viewmodel。在绑定上使用验证规则,或者在使用它进行计算之前只进行验证,因为您关心验证。您不需要在这里执行事件处理程序中的代码。您可以在descontotal
setter中执行此操作。绑定使您完全不用使用事件处理程序。然后删除UpdateSourceTrigger=Explicit
。通常,这样的事情不是通过事件完成的,而是通过使用绑定属性的setter来完成的。例如,在您的示例中,descontotal
属性。直接使用事件是混乱的。您可以通过dispatcher将某些内容排入队列来解决此问题,但一般来说,请查看MVVM,分离视图和视图模型,使用绑定/命令,不要将任何计算放入视图中。既然您已经绑定了,为什么要使用lostfocus之类的事件?当用户弹出选项卡时,该值将传递到viewmodel。在绑定上使用验证规则,或者在使用它进行计算之前只进行验证,因为您关心验证。您不需要在这里执行事件处理程序中的代码。您可以在descontotal
setter中执行此操作。绑定使您完全不用使用事件处理程序。然后删除UpdateSourceTrigger=Explicit
。通常,这样的事情不是通过事件完成的,而是通过使用绑定属性的setter来完成的。例如,在您的案例中,descontotal
属性。
<TextBox Text="{Binding DescontoTotal, Converter={StaticResource PriceConverter1}, Mode=TwoWay, UpdateSourceTrigger=Explicit}" LostFocus="txtTotaisNfe_LostFocus"/>
private void txtTotaisNfe_LostFocus(object sender, RoutedEventArgs e)
{
//Rateia o Total de Desconto da NFe entre os Produtos.
foreach (var item in _lsProdutos)
{
item.Desconto = (ThisDataContext.DescontoTotal / ThisDataContext.TotalProdutos * item.ValorProduto).Round();
}
}
public class PriceConverter1 : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
try
{
return ((decimal)value).ToString("##,###,##0.00");
}
catch
{
return "0.00";
}
}
else
{
return "0.00";
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string price = value.ToString();
decimal result;
if (decimal.TryParse(price, System.Globalization.NumberStyles.Any, null, out result))
{
return result;
}
return value;
}
}