1

私はVB6でコーディングされた大規模なプロジェクトを持っており、数か月間新しいテクノロジーにアップグレードしようとしています。私のプロジェクトは、クライアント サーバー アプリケーションの下で再結合された 6 つの管理モジュールで構成されています。VB から来た私は、論理的に .NET にアップグレードすることを選択しました。多くの調査の結果C#WPFと MVVM パターン (Caliburn Micro を使用) を使用することにしました。

最初はいくつか問題がありましたが、なんとか解決しました。しかし今、私は (すべての複雑なアプリケーションのように) モーダル ポップアップ (またはその他の手法) を介して、さまざまなビューとそれに対応するビューモデルと通信する必要があるところまで来ました。この問題では、MVVM パターンは非常に限定的または複雑に見えます。単純な「このレコードを削除してもよろしいですか (はい/いいえ)」は非常に複雑なタスクです。したがって、EventAgregators として複雑なアーティファクトなしでビューを通信する方法についてのアドバイスを探しています。

これまでのところ、私が見つけた唯一の代替手段は、このブログModalContentPresenterのクラスを使用することです。このソリューションの問題点は次のとおりです。

  • 親ビュー XAML とモーダル XAML を同じビューに記述する必要があります。
  • 同じビューから複数の popus を持つことはできません。

モーダルポップアップを使用したい場所の例は次のとおりです。

  • ビューにボタンを配置して、クライアントを選択します。考えられるすべてのクライアントを含むポップアップを開き、ユーザーがいずれかを選択できるようにする必要があります。
  • 顧客注文に製品ポップアップを追加します。

アイデアや提案はありますか?いくつかのサンプル コードをいただければ幸いです。ありがとう!

4

1 に答える 1

1

私はリンクされたModalContentPresenterコントロールの作成者であるため、いくつかの質問と懸念事項に対処しようとします.

親ビュー XAML とモーダル XAML を同じビューに記述する必要があります。

実際には、両方のビューを別々のファイルに書き込むことができます。ビューは、またはプロパティにバインドされているDataTemplatesに依存するものを使用して、動的にロードできます。ViewModelContentModalContent

このビューの切り替えを実現する一般的な方法について説明しているthisを参照してください。

MainViewModel2 つのプロパティを持ち、メイン コンテンツとモーダル コンテンツのプロパティPrimaryViewModelSecondaryViewModelコマンドを提供する適切なビュー モデルを返す を使用できます。

で次の設定を行うことができますXAML

<DataTemplate DataType="{x:Type FooViewModel}">
    <Controls:FooView />
</DataTemplate>

<DataTemplate DataType="{x:Type BarViewModel}">
    <Controls:BarView />
</DataTemplate>

<controls:ModalContentPresenter 
              Name="modalPresenter"
              Content={Binding DataContext.PrimaryViewModel}
              ModalContent={Binding DataContext.SecondaryViewModel} />

IsModalプロパティがの場合、falseあなたの のみPrimaryViewが表示されます。IsModalプロパティを に設定するとすぐにtrueModalContentPresenterが表示されますSecondaryView

同じビューから複数の popus を持つことはできません。

同じメイン ビューから異なる時間に異なるモーダル コンテンツを表示できるようにしたいということだと思います。

上記の手法を使用すると、プロパティにViewModelバインドされているを切り替えるのと同じくらい簡単です ( に設定して表示する前に)。forがバインドされている限り(そして実装が正しく実装されていれば)、正しいコンテンツが表示されます。ModalContentIsModaltrueDataTemplateViewModelMainViewModelINotifyPropertyChanged

モーダルポップアップを使用したい場所の例は次のとおりです。

ビューにボタンを配置して、クライアントを選択します。可能なすべてのクライアントを含むポップアップを開き、ユーザーがいずれかを選択できるようにする必要があります。

顧客注文に製品ポップアップを追加します。

上記の手法を理解すると、ViewとのViewModelペアがあれば、考えられるあらゆるシナリオをカバーできることがわかるはずです。

例として、次のインターフェースを持つ viewModel を考えてみましょう。

public interface SelectCustomerViewModel : INotifyPropertyChanged {
    event EventHandler CustomerSelected;        
    public ObservableCollection<Customer> Customers { get; }
    public Customer Customer { get; set; }
    public Command CustomerSelectedCommand { get; }
}

public interface MainViewModel : INotifyPropertyChanged {
    public SelectCustomerViewModel ModalContent { get; }
    public Command SelectCustomerCommand { get; }
    public bool IsSelectingCustomer { get; }
}

次のようXAMLになります。

<Window x:Class="ModalContentTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Select a customer">

    <DataContext>
        <vm:MainViewModel />
    </DataContext>

    <DataTemplate DataType="{x:Type SelectCustomerViewModel}">
        <Controls:SelectCustomerView />
    </DataTemplate>

    <c:ModalContentPresenter Name="modalPresenter"
                             ModalContent={Binding ModalContent}
                             IsModal={Binding IsSelectingCustomer}>

        <!-- This is the primary content! -->
        <Grid>
            <Button Content="Select a customer"
                    Command={Binding SelectCustomerCommand} />
        </Grid>

    </c:ModalContentPresenter>

</Window>

仕組みは次のとおりです。

  1. IsSelectingCustomerプロパティはMainViewModelとして始まりますfalse
  2. メイン ビューでボタンをクリックすると、SelectCustomerCommandオブジェクトが呼び出されます。このコマンドは、プロパティをMainViewModelに変更するように に指示します。IsSelectingCustomertrue
  3. ModalContentPresenter、データ テンプレートで指定されたビューを表示します。ユーザーは、「選択した顧客ビュー」とのみ対話できるようになりました。
  4. CustomerSelectedCommand顧客が選択されると、( の にバインドされている)ボタンをクリックするとSelectCustomerViewModelCustomerSelectedイベントが発生します。
  5. にはMainViewModel、イベントに応答するイベント ハンドラがありCustomerSelectedます。ハンドラーはSelectedCustomerからプロパティを読み取り、SelectCustomerViewModel最後にIsSelectingCustomerプロパティを false に戻して、モーダル コンテンツを閉じます。
于 2014-09-13T08:11:43.267 に答える