1

アプリケーションにMVVMパターンを実装する方法を理解しようとして問題が発生しました。これは小さなアプリケーションであり、その機能について説明します。

私のアプリケーションはファイルのバックアップを作成します。UIを使用すると、ユーザーはバックアップするフォルダーとバックアップ先を選択できます。選択した後、「開始」ボタンをクリックします。

次に、フォルダーのソースと宛先をクラスライブラリ(backup.csと呼ばれます)に渡します。クラスライブラリは、各フォルダー内のすべてのファイルのバックアップを作成します。この間に、ログ(Log.cs)が作成され、各ステージと、バックアップを試みた各ファイルの状態(完了、失敗、その他など)が記録されます。現在、ログはメモリのみにあります。

バックアップが完了したら、すべてのログを表示するウィンドウ(ビュー)を開きます。この時点では、MVVMパターンの使用方法を理解できません。

現在のところ、ログ(データを階層的に保持している)をMainWindowのコンストラクターに渡し、xamlのツリービューを使用してデータコンテキストにバインドし、目的の結果を取得します。ただし、MVVMを使用したいと思います。

私の質問は前の質問と非常によく似ています。答えは、ログをパラメーターとしてViewModelコンストラクターに渡すことです。問題は、その方法がわからず、ウィンドウを表示することです。

(私の頭の中で)これを達成できる唯一の方法は、ログをパラメーターとしてビューのコンストラクターに渡すことですが、これはMVVMのポイントを打ち負かします。パラメータをViewModelのコンストラクター(MVVMパターンに適合する)に渡すことはできますが、それは、ViewModelコンストラクターからもViewのインスタンスを作成する必要があることを意味しますか?それ以外の場合は、ViewModelを作成するだけですが、ビューが表示されないため、結果を表示する方法がありません。

私が苦労しているところをはっきりと説明できたと思いますが、誰かが前進する方法を提案できますか?

4

2 に答える 2

2

ほとんどの場合、viewmodelがList<Log>--などのコレクションを受け入れる(そしてプロパティを介して公開する)必要があります。通常、これはですがObservableCollection<Log>、操作がすでに完了している場合は、そのようにする意味はありません。これはあなたが可能な解決策として説明しているものです。

ビューモデルをビューにワイヤリングするには、基本的に次のようにする必要があります。

var viewModel = new LogsViewModel(...);
var view = new LogsView(); // no constructor parameters

view.DataContext = viewModel;

view最後に、アプリケーションウィンドウの論理ツリーのある場所に追加して、表示されるようにします。MVVMフレームワークはこの手順を自動化しますが、これと同じくらい簡単に手動で行うこともできます。

次に、ビューをログコレクションにバインドして、おそらくDataTemplate:を使用して各ログを表示します。

<ItemsControl ItemsSource="{Binding Logs}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <!-- XAML to display each Log does here -->
      <TextBlock Text="{Binding FileName}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
于 2013-01-31T09:25:54.673 に答える
1

例として、メインビューのボタンクリックに基づいてLogViewを表示したい場合。

public override void ShowCommandExecute()
{
    var popup = new LogsView                            
    {
       WindowStartupLocation = WindowStartupLocation.CenterScreen,
       DataContext = new LogsViewViewModel();
    };
    popup.ShowDialog();
}
于 2013-01-31T09:29:36.790 に答える