0

オブジェクトの非同期ロードを処理し、それに応じてカーソルを変更するクラスを実装しました。つまり、UpdateCursorメソッドに次のように記述します。

    static Cursor cursor;

    public AsyncLoader(Func<CbT> request, Callback callback, Cursor cursor)
    {
        this.request = request;
        this.callback = callback;
        AsyncLoader<CbT>.cursor = cursor;

        LatestRequestId = Guid.NewGuid();
        UpdateCursor();
        ...
    }

    void UpdateCursor()
    {
        if (LatestRequestId == Guid.Empty)
        {
            cursor = Cursors.Arrow;
        }
        else
        {
            cursor = Cursors.AppStarting;
        }
    }

このクラスを使用するクラスには、INotifyProperty を実装する Cursor プロパティがあり、ウィンドウのカーソルにバインドされています。

    private Cursor _CurrentCursor;
    public Cursor CurrentCursor
    {
        get { return _CurrentCursor; }
        set
        {
            if (value != _CurrentCursor)
            {
                _CurrentCursor = value;
                OnPropertyChanged("CurrentCursor");
            }
        }
    }

ビューで:

    Cursor="{Binding CurrentCursor}"

問題は、CurrentCursor を AsyncLoader に渡し、UpdateCursor の実行時に変更が CurrentCursor に反映され、PopertyChange イベントが発生するようにするにはどうすればよいかということです。

4

1 に答える 1

0

解決策の1つは、インターフェースを作成することです

interface ICursorHolder{
    Cursor CurrentCursor{get;set;}
}

ICursorHolder 型のインスタンスを AsyncLoader に渡し、Cursor プロパティを使用してこのインターフェイスをクラスに実装します。

public AsyncLoader(Func<CbT> request, Callback callback, ICursorHolder cursorHolder)
{
    this.request = request;
    this.callback = callback;
    AsyncLoader<CbT>.cursorHolder = cursorHolder;//change according to your logic

    LatestRequestId = Guid.NewGuid();
    UpdateCursor();
    ...
}

void UpdateCursor()
{
    if (LatestRequestId == Guid.Empty)
    {
        cursorHolder.Cursor = Cursors.Arrow;
    }
    else
    {
        cursorHolder.Cursor = Cursors.AppStarting;
    }
}

そしてあなたのクラス

public class ShellPresenter: PresenterBase, ICursorHolder{   
    private Cursor _CurrentCursor;
    public Cursor CurrentCursor
    {
        get { return _CurrentCursor; }
        set {
            if (value != _CurrentCursor){
                _CurrentCursor = value;
                OnPropertyChanged("CurrentCursor");
            }
        }
    }    
}

アップ1

更新されたサンプル コード

Upd2

private void CallAsync(){
   ShellPresenter shell=GetInstance();
   Loader.AsyncLoader(request,callback, shell);

}
于 2012-08-15T12:00:53.683 に答える