2

この WPF アプリケーションのイベントを次のように分離しました。

デカップリングを続ける最善の方法は何ですか?

Shell.xaml:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>

Bootstrapper.cs:

public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}

Shell.xaml.cs:

public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}

Customer.cs:

public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}

上記のコードShellは、モデルからビューを正常に分離するため、独自の方法で「処理済み」を処理Customer:IPersonするモデルなどにスワップできます。Employee:IPersonそれが最初の目標でした。

でも今:

  • Processedビューでイベントを発生させる MenuItem または ListView とも通信でき、それを呼び出す要素である必要さえないように、メソッドを Buttonとの通信から切り離すにはどうすればよいですか、例えば単体テストクラス?
  • 送信者 (ボタン) 以外のビューの他の要素を変更するにはどうすればよいですか?たとえば、シェルのステータス バーを変更するにはどうすればよいですか? 2 つの方法があります。
    • すべてのビューを保持するコンテナーを構築し、作成時にコンテナーを Customer に挿入することもできます。その後、顧客はコンテナーを調べて、呼び出し元のビューを必要に応じて操作できます (ただし、イベントを送信したビューと何らかの方法で一致させる必要があります)。コンテナ内のビューは同じものとして)
    • イベントを発生させるときに、イベント引数を使用してビュー全体 (Window オブジェクト) をモデルに送信することもできますが、モデルには、実行時に操作できる領域の種類を (インターフェイスを介して) 知る何らかの方法が必要です。
  • このアプリケーションを、よりデカップリングされた設計の方向にどのように継続しますか?
  • これは、MVC、MVP、MVVM など、実際にはどのようなパターンですか? ビュー (シェル) とモデル (顧客) しか表示されません。
    • プレゼンターはどのように適合しますか?
    • ViewModel はどのように適合しますか?
    • コントローラーはどのように適合しますか?
4

4 に答える 4

5

従来のイベントではなく、コマンドを使用してイベント処理を実装することをお勧めします。コマンド パターンが既に実装されているため、WPF では非常に簡単であり、すべての UI 入力 (ボタン、メニュー項目など) にコマンドが [コマンドの名前] であることを伝え、それらすべてを 1 か所で処理できます。

于 2009-03-19T12:59:03.647 に答える
3

キャメロンマクファーランドはここで良い仕事をしました、しかし私は少し加えることができます。

MV-VMをフォローする場合、デカップリング用のボックス内のツールは、データバインディング、コマンド、接続された動作、およびインターフェイスです。データバインディングは自明である必要があります。コマンドの適切な説明はすでに得ていますが、RoutedCommandを避け、ICommandの実装に固執することをお勧めします。アタッチされたビヘイビアーは、アタッチされている要素のイベントをサブスクライブするDependencyPropertyにアタッチされており、このシナリオでは、イベント処理をViewModelに中継するために使用されます。インターフェイスは最大の柔軟性を提供しますが、インターフェイスをViewModelに渡す方法を理解する必要があります。このすべてを今すぐ学ぶための最良の方法は、Googleに行き、既存のMV-VMフレームワークを調べることです。フレームワークのリストは次のとおりです。

  • Prism / Composite WPF(http://www.codeplex.com/CompositeWPF)。これは、Microsoft Patterns&Practicesグループからのものです。ここにはたくさんの良いものがありますが、ここから学ぶことができる上記の3つの例の1つは、ICommandの使用方法です。Prismには、ICommandを実装し、MV-VMのViewModelからのコマンドの使用を簡素化するDelegateCommandが含まれています。

  • Caliburn(http://www.codeplex.com/caliburn)。最近リリースされた、これから学ぶことができる重要なことの1つは、このライブラリが「アクション」に使用するアタッチされた動作の使用方法です。

  • Onyx(http://www.codeplex.com/wpfonyx)。免責事項:私はこれの作者です。現在のアルファソースは利用可能ですが、これはまだリリースされていません。これは、ViewModelへのインターフェイスを提供する方法の問題に対する新しいソリューションを提供します。

于 2009-03-20T11:52:52.760 に答える
1

Processed メソッドを特にボタン
コマンドとの通信から分離するにはどうすればよいですか。IPerson インターフェイスにコマンドを配置し、シェルの xaml からそのコマンドを呼び出します。


ビューのプロパティとバインディングの他の要素を変更するにはどうすればよいですか。状態 (処理済み/未処理) を示すプロパティがある場合は、バインディングを使用して、そのプロパティを xaml に直接表示できます。


シェルと IPerson の間に ViewModel を作成することで、MVVM パスをさらに下りますViewModel は、1) バインディングに必要なプロパティ、および 2) 実行が必要なコマンドを持つように設計されています。ViewModel は、モデルから必要なものを UI に提供するように設計されています。


現在、これは何のパターンですか?何もない。ビューとモデルの 2 つのオブジェクトしか表示されません。Presenter、Controller、または ViewModel がありません。

WPF の場合、ViewModel を好みます。MVVM の詳細については、この質問を参照してください。

于 2009-03-19T14:12:54.907 に答える
1

チェンが示唆するように、私はコマンドパターンを調べます:ルーティングされたコマンド

私が多くのことを学んだ実例は、Jaime Rodriquez のブログ ( Southridge ) にあります。

于 2009-03-19T14:09:40.857 に答える