2011-01-17 5 views
4

항목이있는 목록 상자가있는 피벗 컨트롤이 있습니다. 다음 피벗 항목으로 스크롤하면 데이터 바인딩에 약간의 시간이 걸리고 목록 상자를 표시 할 준비가되면 바로 메뉴 모음을 활성화해야하므로 데이터 바인딩이 완료된 시점을 알고 싶습니다. 여기에서 나를 도울 수있는 이벤트를 찾을 수 없습니다. 목록 상자의 Loaded 이벤트를 시도했지만 일부 피벗 항목에서는 작동하지만 다른 일부에서는 작동하지 않습니다! 레이아웃 업데이트 이벤트도 시도했지만 너무 많은 시간을 해고하고 나에게 도움이되지 않습니다.목록의 데이터 바인딩이 완료되었는지 어떻게 확인할 수 있습니까? (wp7)

어떻게해야합니까? 감사합니다.

답변

1

피벗 항목을 빠르게 스크롤 할 때 좋은 성능을 얻으려면 SelectedIndex가 변경 될 때까지 피벗 항목의 내용을 바인딩해야합니다. 이렇게하면 사용자가 피벗 항목 사이를 빠르게 스 와이프하는 동안 바인딩되지 않습니다. 피벗 아이템에서 멈 추면 바인딩됩니다.

그런 다음 LayoutUpdated 이벤트의 피벗 항목에서 ListBox의 ItemsSource 속성을 설정해야합니다.


     public static void InvokeOnLayoutUpdated(this FrameworkElement element, Action action) 
     { 
      if (element == null) 
      { 
       throw new ArgumentNullException("element"); 
      } 
      else if (action == null) 
      { 
       throw new ArgumentNullException("action"); 
      } 

      // Create an event handler that unhooks itself before calling the 
      // action and then attach it to the LayoutUpdated event. 
      EventHandler handler = null; 
      handler = (s, e) => 
      { 
       element.LayoutUpdated -= handler; 
       action(); 
      }; 
      element.LayoutUpdated += handler; 
     } 

그래서 당신은 다음과 같은 무언가를보고 몇 가지 코드를 할 것이다 : 나는 다음과 같은 확장 방법을 사용


pivot.InvokeOnLayoutUpdate(() => 
    { 
    Dispatcher.BeginInvoke(() => 
     { 
     list.ItemsSource = source; 
     ApplicationBar.IsMenuEnabled = true; 
     }); 
    }); 
+0

왜 Dispatch.BeginInvoke, 자사의'LayoutUpdated' 이벤트 확실히 그 UI에 화재 실? – AnthonyWJones

+0

참; 거의 확실하게 필요하지 않습니다. 실제로 UI 스레드가 아닌 UI 스레드에서 호출하려면 다른 확장 mthod를 사용합니다. 간략하게하기 위해 생략되었습니다. –

+0

좋은 방법이지만, 데이터 바인딩을 중지 할 수있는 방법은 selectedIndex 변화? 데이터 바인딩이 진행되는 동안 피벗은 제스처에 응답하지 않으며 데이터 바인딩이 완료되기 전에 제스처를 수행하면 데이터로드 후에 실행됩니다. 피벗은 내 동작을 기억하고 데이터 바인딩이 완료된 후 IsHitTestVisible을 false로 설정했다하더라도이를 처리합니다. – johnX99

관련 문제