0

ProductList が読み込まれる View / ViewModel があります。このリストは画面には表示されません。

私がする必要があるのは、新しいビュー/ビューモデル (例: SelectProductView / SelectProductViewModel) を表示し、それらに ProductList を渡し、ユーザーが特定の製品を選択した後、このビューを閉じて、選択した製品を利用することです。

これを達成するための最良の方法は何ですか?

私はMVVMLightを使用していますが、アイデアはそれだけに限定されるべきではないと思います. 最も簡単な方法は、ビューを作成してそれにコレクションを渡すことですが、これは MVVM に適しているとは言えません。最初の ViewModel から SelectProductViewModel を作成し、それにコレクションを渡すことを考えていましたが、SelectProductView を自動的に作成し、作成した SelectProductViewModel にバインドする方法がわかりません。

編集: 私のアプリケーションでは、ビューの構造は少し複雑です。このビューは画面全体をカバーする必要があるため、基本的に SelectProductView をホストする必要があるメイン ビューがあります。MainView には (タブを介して) 多くの子ビューと孫ビューが含まれているため、製品の選択要求を発行できる 3 つの異なる子ビューまたは孫ビューが存在する可能性があります。また、一部のビューには製品がプリロードされていないため、このタスクはおそらく SelectProductViewModel に伝達する必要があります。

構造の例:

                              MainView
                        /                   \
         ChildViewA                                   ChildViewB
            /  \                                       /     \
GrandChildViewA1 GrandChildViewA2            GrandChildViewB1 GrandChildViewB2

したがって、GrandChildViewA1、ChildViewB、および GrandChildViewB2 は、製品を選択するための要求を発行できます。リクエストを発行したビューのみが選択した製品を取得する必要があり、他のユーザーはそれを気にするべきではありません。GrandChildViewA1 には製品がロードされますが、GrandChildViewB2 には ProductList がロードされません。つまり、パフォーマンスのために、GrandChildViewA1 は製品リストを SelectProductViewModel に渡す必要がありますが、GrandCHildViewB2 には製品リストが含まれていないため、SelectProductViewModel はデータベースからデータをフェッチする必要があります。

4

2 に答える 2

0

最も簡単な方法は、ビューモデルの最初のアプローチに進み、ダイアログサービスを使用して選択ビューを表示することです。

ProductionListを使用するビューモデルは、dialogserviceを呼び出し、ProductionListをパラメーターとして使用するProductSelectionViewmodelを配置するだけです。これは最初にビューモデルであるため、WPFがProductSelectionViewmodelをレンダリングする方法を認識できるようにデータテンプレートを作成する必要があります。

ここに簡単なdialogserviceへのリンクがあります。

ところで:私の意見では、viewmodelの最初のアプローチはmvvmを実行するときにはるかに簡単です。

編集:

SelectProductCommandのProductionListViewModelで

 var selectProductViewModel = new SelectProductViewModel(this.ProductionList);
 var result = this.uiDialogService.ShowDialog("Select Product", selectProductViewModel );

 //if result true, simple get the selected product
 this.SelectedProduct = selectProductViewModel.MySelectedProduct;

それがすべて-シンプルで簡単

于 2012-06-18T06:13:25.103 に答える
0

データを受信するためのコントラクトを定義するジェネリック ビューモデルを作成します。

public abstract class PassDataViewModel<T> : ObservableObject
{
    public T Data { get; }
}

次に、製品リストのより一般的な ViewModel を次のように作成します。

public class SelectProductViewModel : PassDataViewModel<Product>
{
    private Product _selectedProduct;
    private ObservableCollection<Product> _products = new ObservableCollection<Product>();

    public SelectProductViewModel(IList<Product> products)
    {
        _selectedProduct = _products.First();
    }

    public IEnumerable<Product> Products
    {
        get { return _products; }
    }

    public Product SelectedProduct
    {
        get { return _selectedProduct; }
        set
        {
            _selectedProduct = value;
            OnPropertyChanged("SelectedProduct");
            OnPropertyChanged("Data");
        }
    }

    public Product Data
    {
        get { return _selectedProduct; }
    }
}

これを次のように使用します。

  1. 最初の viewModel は、SelectProductViewModelのインスタンスを作成できます(たとえば、コマンドが呼び出されたとき)。
  2. 製品リストを新しいSelectProductViewModelインスタンスに渡します。
  3. 画面上のビューを変更するには、DataTemplate を使用します (この投稿では、これを行う方法を説明します)。
  4. SelectProductViewModelの data プロパティから返された製品を返すプロパティを親 viewModel に用意します(PropertyChanged イベントを親 viewModel に伝達する必要があります)。
于 2012-06-17T15:39:43.273 に答える