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;
        }
    }