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
イベントについて知りません。ApiRequest
ViewModel を介して 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
て、とにかくイベントを発生させたかったからです。
ここでは、これをすべて簡単にリンクするための重要な概念が欠けているように感じました。
ご意見ありがとうございます。