1

私の特定の問題は、ViewModel から Telerik DataBoundListBox メソッド StopPullToRefreshLoading(true) を実行しようとすることです。難点は、コード ビハインドにアプリケーション ロジックを配置することで、MVVM の慣習を破りたくないということです。

私はMVVMに比較的慣れていないので、ビュー上のコントロールのメソッドと対話するための適切な規則が何であるかわかりません。このトピックについて何度も検索しましたが、自分の状況に適用できる解決策をまだ見つけていません。おそらく答えに出くわしたと思いますが、適切な結論を導き出していません。

これはサードパーティのコントロールではよくあることのようですが、問題について適切な方法で考えていないだけかもしれません。

MVVM Light を使用して、初めての Windows 8 Phone アプリを構築しています。

4

2 に答える 2

1

多くの人が、MVVM に従っている場合、コード ビハインドにコードを含めてはならないという考えにとらわれています。これは単にそうではありません.MVVMのようなデザインパターンは、コードをより保守しやすくするためにあります. 何かが UI のみに直接関係し、ビューモデル クラスの情報を気にしない場合は、必ずコード ビハインドに入れます。サード パーシャル コントロールを使用していたときも同じ状況でした。コード ビハインドにコードを配置するよりも悪くない、または悪くないオプションが他にない場合があります。

于 2012-12-11T23:09:31.743 に答える
1

まず、これについて Chris McCabe に同意します。デザイン パターンはガイドライン、フレームワーク、提案です。生きるか死ぬかのルールではありません。そうは言っても、「実際の」ビジネス ロジックを UI に導入することなく、2 つ (VM/Telerik) を結合できるはずです。

最初の可能性は、コントローラーでイベントを使用することです。UI はこのイベントをサブスクライブして、呼び出しを Telerik コントロールに転送できます。ただし、UI はいつ呼び出されるかを決定するべきではありません

class MyModel {
    public event EventHandler StopRefreshLoading;
}

class myForm : Form {

    public myForm(MyModel data)
    {
        data.StopRefereshLoading += (o, e) => this.CustomControl.StopPullToRefreshLoading(true);
        // ... etc
    }

率直に言って、私はこの種の動作にはインターフェイスを使用することを好みます。これにより、コントローラーが実装を強制的に新しいコントラクト要件に更新することが容易になります。欠点は、複雑な UI ではインターフェイスが冗長になりすぎて、テストの作成が困難になる可能性があることです。

interface IMyModelView {
    void StopRefreshLoading();
}

class myForm : Form, IMyModelView {

    void IMyModelView.StopRefreshLoading()
    {
        this.CustomControl.StopPullToRefreshLoading(true);
    }

どちらの方向に進んでも、UI デザイン パターンの違反が発生する可能性があります。ただし、現実の世界では、特定のパターンに厳密に従うことにポイントはありません。パターンは、コードの信頼性、テスト可能性、柔軟性などを向上させるための補助として存在します。パターンを使用する理由を決定すると、いつそのパターンに安全に違反できるかを評価できます。

于 2012-12-11T23:36:03.630 に答える