2013-10-07 2 views
1

프리즘 응용 프로그램에는 내 뷰 모델에서 호출되는 많은 비동기 작업이 있습니다. 경우에 따라 viewmodel이 비동기 작업에서 결과를 얻을 때까지보기를 사용하지 않도록 설정하고 일종의 사용중 표시기를 표시해야합니다.프리즘을 사용하여 기본로드 뷰 만들기

이 동작을 구현하는 기본보기를 만들지 만 (즉,보기를 비활성화하고 위에 바쁜 표시기를 표시하는 IsLoading의 종속성 속성이 있음). 문제는이 기본 뷰를 구현하는 방법을 모르겠습니다. 도움을 주시면 감사하겠습니다.

편집 : 나는 작업을 수행하는 LoadingView를 작성했다고 생각합니다.

public class LoadingView : UserControl { private object content;

public bool IsLoading 
    { 
     get 
     { 
      return (bool)GetValue(IsLoadingProperty); 
     } 
     set 
     { 
      SetValue(IsLoadingProperty, value); 
     } 
    } 

    private ProgressRing m_RingControl; 

    public LoadingView() 
    { 
     m_RingControl = new ProgressRing(); 
     m_RingControl.IsActive = false; 
    } 

    // Using a DependencyProperty as the backing store for IsLoading. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsLoadingProperty = 
     DependencyProperty.Register("IsLoading", typeof(bool), typeof(LoadingView), new PropertyMetadata(false, IsActivePropertyChanged)); 

    private static void IsActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     LoadingView view = d as LoadingView; 
     if (view != null) 
     { 
      // Loading - show ring control 
      if (((bool)e.NewValue) == true) 
      { 
       view.content = view.Content; 
       view.Content = view.m_RingControl; 
       view.m_RingControl.IsActive = true; 
      } 
      else 
      { 
       view.m_RingControl.IsActive = false; 
       view.Content = view.content; 
      } 
     } 
    } 
} 

와 내가 뷰 모델

답변

1

이 일부 IsLoading (또는 IsBusy)와 LoadingView.IsLoading 구속력을 넣어 정말 빨리 정말 복잡한 얻을 수있는 주제이다.

기본 뷰 모델에 IsBusy 속성을 추가하는 대신 약간의 변경을 권고하고 대신 파생 된 각 뷰 모델이 고유 한 특정 검사를 구현할 수 있도록 추상화합니다.

public class BaseViewModel : INotifyPropertyChanged 
{ 

    public abstract bool IsBusy { get; } 

} 

public class FancyViewModel : BaseViewModel 
{ 

    public override bool IsBusy 
    { 
     get { return [check #1] && [check #2]...; } 
    } 
} 

이제는 바쁜지 ​​여부를 결정하는 것은 각 특정보기 모델에 달려 있습니다. 조잡한 메커니즘은 비동기 함수가 시작될 때마다 증가하는 카운터를 가지며 연산이 끝날 때 카운터를 감소시킵니다. 값이 0이면 현재 비동기 작업이 없습니다. 플래그 또는 카운터를 사용하는 경우 compiler optimisations으로 인해 발생할 수있는 다양한 속성 읽기 문제를 알고 있으면 적절한 위치에서 volatile 키워드를 사용하는 방법을 배우십시오.

또는 카운터를 유지하는 대신 thread safe CountdownEvent class을 사용할 수 있습니다. 정말로 진보하고자한다면 System.Threading namespace에있는 다양한 스레드 신호 메커니즘을 확인하거나 task parallelismTask object을 확인하십시오.

+0

답장을 보내 주셔서 감사합니다.하지만 내 의도는 뷰 모델보다보기에 더 가깝습니다. – user2853648

+0

@ user2853648 나는 그것을 알고있다, 나의 대답은 하나의'IsBusy' 속성으로 비동기 메서드의 결과를 마샬링하는 것을 돕는 것을 목표로했다. 그래도 컨트롤을 찾고 있다면 [BusyIndicator] (http://elegantcode.com/2011/10/07/extended-wpf-toolkitusing-the-busyindicator/) – slugster

관련 문제