2014-12-09 2 views
0

article을 사용하여 내 뷰 모델에서 바인딩 할 수있는 SelectionChangedCommand를 설정했습니다. 내보기 모델의 SelectionChangedCommand 실행 된 방법에서ComboBox 선택한 항목이 SelectionChangedCommand의 실행이 완료 될 때까지 설정되지 않습니다.

<ComboBox Height="20" 
      SelectedItem="{Binding SelectedName}" 
      ItemsSource="{Binding NameCollection}" 
      commandBehaviors:SelectionChangedBehavior.Command="{Binding SelectionChangedCommand}"> 

: 여기

내 뷰의 사용자가 내 콤보 상자에서 사용할 새 이름을 선택하면

지금
private void SelectionChangedExecuted() 
{ 
    // The logic in this method can take up to 30 seconds at times. 
} 

내 문제, 그것은 걸릴 수 있습니다 것을 30 초 동안 자신의 이름이 선택 될 때까지 기다립니다. SelectionChangedExecuted 메서드가 끝날 때까지 이전 이름이 표시됩니다. 이상적으로, 그들이 이름을 선택할 때, 나는 그 이름이 즉시 나타나기를 원합니다, 그리고 나서 그들은 30 초를 기다릴 수 있습니다. 현재 설정으로이 작업을 수행 할 수 있습니까?

현재 동작 : 콤보 상자에
- 현재 항목 : "밥"
- 사용자가 선택 : "스티브"ComboxBox의 현재 항목은 아직
-30 초 "밥"동안
- 사용자는 30 초를 기다립니다 콤보 상자의 현재 항목 끝났 : 콤보 상자에
- 현재 항목 : "밥"
- 사용자가 선택 : "스티브"및 콤보 상자의 현재 항목
"스티브"는 "스티브"구인 행동이

- 사용자 기다리는 30 초, ComboxBox의 현재 항목은 여전히 ​​"스티브"
-30 초 콤보 상자의 현재 항목은 아직 끝난 상태에서 "스티브"

+0

30 초 동안 어떤 작업을 수행하고 있습니까? 30 초 기다려야 겠어? – Vishal

+0

많은 양의 자원/객체를 메모리에로드합니다. 30 초는 최악의 시나리오입니다. 컬렉션 뷰를 사용하면 SelectionChangedCommand를 사용하는 대신 선택된 항목이 바로 반영됩니다. 콜렉션 뷰에서 현재 항목 변경 이벤트를 수신합니다. 이것은이 문제와 잘 맞았지만 다른 문제를 야기합니다. 이제 SelectedItem 속성을 사용하려고합니다. – jsirr13

답변

0

는 UI 스레드에서 동 기적 SelectionChangedExecuted() 방법을 실행하고 있는지 그 이유는 . async/await을 사용하여이 작업을 비동기 적으로 수행하여 백그라운드 작업자 스레드에서 코드를 실행해야합니다.

private static async void SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Selector selector = (Selector)sender; 
    if (selector != null) 
    { 
     ICommand command = selector.GetValue(CommandProperty) as ICommand; 
     if (command != null) 
     { 
      await Task.Run(() => command.Execute(selector.SelectedItem)); 
     } 
    } 
} 
+0

4.0을 사용하십시오. 그렇지 않으면 확실히 시도해 보겠습니다. – jsirr13

+0

그러면,'BackgroundWorker' 솔루션 (나는 만족스럽지 않습니다) 또는'Task.Factory.StartNew()'를'await'하지 않고 시도 할 수 있습니다. 이 경우 "화재 및 잊기"모드에서 백그라운드 작업을 시작합니다. 중요한 점은 UI를 빠르게 응답하려면 백그라운드 스레드에서 장기 실행 처리를 실행해야한다는 것입니다. – dymanoid

+0

이 긴 작업 중에 진행 대화 상자가 있습니다. 선택한 항목을 즉시 업데이트하는 것이 중요합니다. UI에서 시각적으로 선택된 항목을 업데이트 할 때까지 액션이 완료 될 때까지 기다립니다. – jsirr13