2

Model クラスのプロパティ変更イベントを ViewModel を介してビューに伝達する方法を理解するのに問題があります。MVVMパターンに準拠しようとしているので、覚えておいてください。

ViewModel で公開しようとしているモデルがあります。私の Model クラスは、Api 呼び出しを照会してサーバーのステータスを取得し、そのステータスをパブリック プロパティで公開します。元:

public class ServerStatusRequest : ApiRequest
{
    //Exposable properties by request
    public ServerStatusHelperClass Status { get; set; }

クエリServerStatusHelperClassで結合された結果の単なるラッパーです。

public class ServerStatusHelperClass
{
    public bool ServerStatus { get; set; }
    public int OnlinePlayers { get; set; }

私の ApiRequest 基本クラスの優れた点は、特定の Api 呼び出しのキャッシュ時間をチェックし、System.Timers.Timer を使用して結果を更新することです。たとえば、ServerStatus Api 呼び出しは Api で 3 分間キャッシュされるため、3 分ごとにServerStatusApiRequestオブジェクトに新しいデータが含まれます。UpdatedResultsすべての ApiRequest クラスでイベントを公開して、新しいデータが入ったときに通知します。

ServerStatusApiRequest今、ViewModel にインスタンスを持たせてそのServerStatusHelperClass Statusプロパティにバインドし、情報が更新されるたびに変更を最新の状態に保ちたいと思っていますが、私のビュー (バインディング用) は私のモデルについて知ることができないため、そうではありません。クラスでの私のUpdatedResultsイベントについて知りません。ApiRequestViewModel を介して View に反映するにはどうすればよいですか? 私はここで完全に奇妙なことをしていますか?

これは私が持っているもので、半作業ですが、非常にハッキーなソリューションだと思います:

私のViewModelでは:

    public const string EveServerStatusPropertyName = "EveServerStatus";
    private ServerStatusRequest _eveServerStatus = new ServerStatusRequest();
    public ServerStatusRequest EveServerStatus
    {
        get
        {
            return _eveServerStatus;
        }
        set
        {
            //if (_eveServerStatus == value)
            //{
            //    return;
            //}

            //RaisePropertyChanging(EveServerStatusPropertyName);
            _eveServerStatus = value;
            RaisePropertyChanged(EveServerStatusPropertyName);
        }
    }

    public void UpdateEveServerStatus(object sender, EventArgs e)
    {
        EveServerStatus = (ServerStatusRequest)sender;
    }

ViewModels コンストラクターで、モデルのイベントをサブスクライブします。

EveServerStatus.UpdatedResults += new UpdatedResultsEventHandler(UpdateEveServerStatus);

ご覧のとおり、これは非常に冗長に見えます。また、セッターのチェックをコメントアウトしなければならないという問題にも遭遇しました。EveServerStatusその時点で、知らないうち_eveServerStatusにすでに更新されていvalueて、とにかくイベントを発生させたかったからです。

ここでは、これをすべて簡単にリンクするための重要な概念が欠けているように感じました。

ご意見ありがとうございます。

4

1 に答える 1

1

私が探していた動作を実装するためのより良い方法に出会いました。これが私のViewModelのコードです:

    private ServerStatusRequest _eveServerStatus = new ServerStatusRequest();

    public ServerStatusRequest EveServerStatus
    {
        get
        {
            return _eveServerStatus;
        }
    }

ビューモデルもビューもこのデータを変更する必要がないため、セッターはありません。また、ServerStatusRequestクラス内ServerStatusHelperClassには、質問に示されているように、オブジェクトを公開するプロパティがあります。を変更し、次のServerStatusHelperClassように実装INotifyPropertyChangedしました。

public class ServerStatusHelperClass : ObservableObject
{
    private bool _serverStatus;
    public bool ServerStatus
    {
        get
        {
            return _serverStatus;
        }
        set
        {
            _serverStatus = value;
            RaisePropertyChanged("ServerStatus");
        }
    }
...

ObservableObjectINotifyPropertyChangedmvvmlight から私のために実装する単純なクラスです。

これを行うことで、ApiRequestクラスがServerStatusHelperClassオブジェクトを変更すると、ビューが自動的に更新されます。

このソリューションに関する意見を歓迎します。

于 2013-02-12T00:56:53.360 に答える