Индикатор Mvvm и команда EventToCommand — текстовое поле дважды теряет фокус

#silverlight #mvvm #mvvm-light

#silverlight #mvvm #mvvm-индикатор

Вопрос:

У меня есть несколько текстовых полей в форме, в которых при потере фокуса я хотел бы вызвать хранимую процедуру установки для сохранения данных, затем в моей функции обратного вызова вызвать сохраненную процедуру получения, которая обновит сводку затрат на работу в моей форме. Я использую Mvvm light, и когда я пытаюсь привязать EventToCommand к LostFocus EventTrigger, моя команда выполняется дважды.

Я понимаю, что это из-за переполнения события, но я не уверен, как убедиться, что мой метод действительно запускается только один раз. Вот мой 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    
}
  

Большое спасибо,

Скотт

Ответ №1:

Я раньше не сталкивался с такой проблемой с EventToCommand. Возможно, в вашем приложении есть что-то странное, вызывающее проблему.

В общем, я не полагаюсь на пользовательский интерфейс, чтобы делать правильные вещи. Если updateJC не должен выполняться до завершения предыдущего вызова, рассмотрите возможность добавления флага «isUpdatingJC» в вашем классе. Обновляйте JC только тогда, когда флаг имеет значение false, и установите для него значение true, прежде чем приступить к обновлению. Таким образом, вы не попадаете в затруднительное положение из-за проблем с некоторыми пользовательскими интерфейсами.

Надеюсь, это поможет… Приветствую!

Комментарии:

1. Проблема была не в том, что updateJC запускался асинхронно и не был завершен при повторном запуске. Я хочу, чтобы оно срабатывало только один раз. В итоге я просто создал класс для этой формы, который содержал свойство для каждого из полей. Всякий раз, когда я обновляю свойство, я вызываю updateJC, который собирает объект и отправляет его на обработку.

Ответ №2:

Проблема была не в том, что updateJC запускался асинхронно и не был завершен при повторном запуске. Я хочу, чтобы оно срабатывало только один раз. В итоге я просто создал класс для этой формы, который содержал свойство для каждого из полей. Всякий раз, когда я обновляю свойство, я вызываю updateJC, который собирает объект и отправляет его на обработку