1

以下のシナリオの設計に関するアドバイスを探しています。

高レベル情報:

  • いくつかの車の情報をリストするグリッドを含む WPF GUI があります。
  • これには、ユーザーがリストに新しい ICar オブジェクトを追加できるように、いくつかの基本フィールドを含むフォームをポップアップ表示する [新しい車を追加...] ボタンが含まれています。
  • メイン ウィンドウとフォームの両方が、MVVM パターンに従って設計されています (また、コマンドの分離も行われています)。

流れと質問:

  • 「Add new Car...」ボタンは、フォームをロードするメイン ウィンドウ コマンドにバインドされています。
  • フォームは背景オブジェクトにバインドされているため、ユーザーが「OK」を押すと、オブジェクトが元のウィンドウに戻ります。

ただし、その最後のステップを設計する方法がわかりません。つまり、次のようにする必要があります。

  1. 私のフォームにいくつかのパブリックメソッドを呼び出して、それ自体で呼び出されるようにします。

    • フォームをロードしています (ShowDialog..)。
    • プロパティバインディングを行います(すでに行われています)
    • 新しい Car オブジェクトを呼び出し元 (ここではメイン ウィンドウ) に返しますか?
  2. または:

    • メイン ウィンドウから form.ShowDialog() を呼び出します。
    • ユーザーによって定義された新しい Car オブジェクトを取得するために、何か他のことを行います (方法がわかりません)。

ありがとうございました!

4

2 に答える 2

4

このようなもの:

interface IPresentationService
{
    bool ShowInDialog(ViewModel viewModel);
}

class CarViewModel : ViewModel {}
class MainViewModel : ViewModel
{
    [Import]
    private IPresentationService presentationService;

    private void AddNewCar()
    {
        var car = new CarViewModel();
        if (presentationService.ShowInDialog(car))
        {
            Cars.Add(car);
        }
    }

    public MainViewModel()
    {
        Cars = new ObservableCollection<CarViewModel>();
        AddNewCarCommand = new RelayCommand(AddNewCar);
    }

    public ObservableCollection<CarViewModel> Cars { get; private set; }
    public ICommand AddNewCarCommand { get; private set; }
}

IPresentationServiceポップアップウィンドウを作成して表示することを目的としたサービスはどこにありますか。のインスタンスは、サービスの場所または依存性注入 ( MEF を使用した依存性注入を意味します)IPresentationServiceを介して取得できます。[Import]

于 2013-06-10T05:35:42.327 に答える
0

MainView には New Car ボタンがあるため、Main ViewModel には NewCar プロパティがある場合があります。

ボタンがクリックされたときに車の新しいインスタンスを作成し、そのインスタンスをダイアログに渡して、ユーザーが新しい車の値を入力できるようにすることができます。

ダイアログが閉じられると、メイン ビューは車のコレクションに対して追加の検証 (一意のナンバー プレート) を実行し、正しいことがわかった場合は、新しい車を車のコレクションに追加し、この追加/変更をモデルに伝達することができます。

このように、ダイアログは車の詳細を担当し、メイン ビューはコレクションへの車の追加を担当します。

于 2013-06-10T07:01:16.343 に答える