2

私のプリズム アプリケーションには、ビュー モデルから呼び出される多くの非同期操作があります。場合によっては、ビューモデルが非同期操作から結果を返すまで、ビューを無効にしてビジー インジケーターを表示したいことがあります。

私は、この動作を実装するベース ビューを作成することを考えました (つまり、ビューを無効にし、その上にビジー インジケーターを表示する 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;
            }
        }
    }
}

ビューモデルにIsLoading(またはIsBusy)を使用してLoadingView.IsLoadingにバインディングを配置します

4

1 に答える 1

2

これは、非常に複雑になりやすいテーマです。

基本ビューモデルに IsBusy プロパティを配置する代わりに、抽象化して、各派生ビューモデルが独自の特定のチェックを実装する必要があるように、アプローチを少し変更することをお勧めします。

public class BaseViewModel : INotifyPropertyChanged
{

    public abstract bool IsBusy { get; }

}

public class FancyViewModel : BaseViewModel
{

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

ビジーかどうかを判断するのは、特定の各ビューモデル次第です。大雑把なメカニズムは、非同期関数が開始されるたびにインクリメントし、操作が終了するとデクリメントするカウンターを持つことです。その値がゼロに等しい場合、現在の非同期操作はありません。フラグまたはカウンターを使用する場合、コンパイラの最適化が原因で発生する可能性があるさまざまなプロパティ読み取りの問題に注意し、適切な場所で volatile キーワードを使用することを学びます。

または、カウンターを保持する代わりに、スレッド セーフなCountdownEvent クラスを使用できます。本当に高度になりたい場合は、System.Threading 名前空間のさまざまなスレッド シグナル メカニズムを確認するか、タスクの並列処理Task オブジェクトを調べてください。

于 2013-10-07T08:19:29.237 に答える