Mvvm Light& EventToCommand - 文本框LostFocus触发两次

时间:2011-04-15 00:24:50

标签: silverlight mvvm mvvm-light

我在表单上有几个文本框,当焦点丢失时,我想调用一个setter存储过程来保存数据,然后在我的回调函数中调用一个getter存储过程,它会更新一个作业成本汇总在我的表格上。我正在使用Mvvm light& amp;当我尝试&在LostFocus EventTrigger上绑定一个EventToCommand,我的命令被触发两次。

我理解这是由于事件冒泡,但我不确定如何确保我的方法实际上只被触发一次。这是我的xaml:

<TextBox x:Name="txtMiles" Grid.Row="1" Width="80" Grid.Column="2" Margin="2" Text="{Binding Miles, Mode=TwoWay}" HorizontalAlignment="Center" >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="LostFocus">
            <cmd:EventToCommand Command="{Binding UpdateJobCost}" CommandParameter="{Binding Text, ElementName=txtMiles}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

我的ViewModel:

public RelayCommand<string> UpdateJobCost { get; set; }
public WorkOrderControlViewModel(TSMVVM.Services.IWorkOrderService workOrderService)
{
    WorkOrderService = workOrderService;
    RegisterCommands();
    LoadData();
}
private void RegisterCommands()
{
    UpdateJobCost = new RelayCommand<string>((value) => updateJC(value));
}
private void updateJC(string value)
{
    //Handle Setter service call here    
}

非常感谢,

斯科特

2 个答案:

答案 0 :(得分:1)

在使用EventToCommand之前我没有看到过这个问题。您的应用中可能会出现一些引起问题的时髦。

一般来说,我不依赖UI来做正确的事情。如果在前一次调用完成之前不应执行updateJC,请考虑在类中添加“isUpdatingJC”标志。仅在标志为false时更新JC,并在开始更新之前将其设置为true。这样你就不会陷入困境,因为有些UI存在问题。

希望有帮助...... 干杯!

答案 1 :(得分:0)

问题不在于updateJC触发异步,而是在再次触发时不完整。我希望它只发射一次。我最后只为这个表单创建了一个类,其中包含每个字段的属性。每当我更新属性时,我都会调用updateJC来收集对象&amp;发送以进行处理