私はリンクされたModalContentPresenter
コントロールの作成者であるため、いくつかの質問と懸念事項に対処しようとします.
親ビュー XAML とモーダル XAML を同じビューに記述する必要があります。
実際には、両方のビューを別々のファイルに書き込むことができます。ビューは、またはプロパティにバインドされているDataTemplates
に依存するものを使用して、動的にロードできます。ViewModel
Content
ModalContent
このビューの切り替えを実現する一般的な方法について説明しているthisを参照してください。
MainViewModel
2 つのプロパティを持ち、メイン コンテンツとモーダル コンテンツのプロパティPrimaryViewModel
とSecondaryViewModel
コマンドを提供する適切なビュー モデルを返す を使用できます。
で次の設定を行うことができます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
プロパティを に設定するとすぐにtrue
、ModalContentPresenter
が表示されますSecondaryView
。
同じビューから複数の popus を持つことはできません。
同じメイン ビューから異なる時間に異なるモーダル コンテンツを表示できるようにしたいということだと思います。
上記の手法を使用すると、プロパティにViewModel
バインドされているを切り替えるのと同じくらい簡単です ( に設定して表示する前に)。forがバインドされている限り(そして実装が正しく実装されていれば)、正しいコンテンツが表示されます。ModalContent
IsModal
true
DataTemplate
ViewModel
MainViewModel
INotifyPropertyChanged
モーダルポップアップを使用したい場所の例は次のとおりです。
ビューにボタンを配置して、クライアントを選択します。可能なすべてのクライアントを含むポップアップを開き、ユーザーがいずれかを選択できるようにする必要があります。
顧客注文に製品ポップアップを追加します。
上記の手法を理解すると、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>
仕組みは次のとおりです。
- の
IsSelectingCustomer
プロパティはMainViewModel
として始まりますfalse
。
- メイン ビューでボタンをクリックすると、
SelectCustomerCommand
オブジェクトが呼び出されます。このコマンドは、プロパティをMainViewModel
に変更するように に指示します。IsSelectingCustomer
true
- は
ModalContentPresenter
、データ テンプレートで指定されたビューを表示します。ユーザーは、「選択した顧客ビュー」とのみ対話できるようになりました。
CustomerSelectedCommand
顧客が選択されると、( の にバインドされている)ボタンをクリックするとSelectCustomerViewModel
、CustomerSelected
イベントが発生します。
- には
MainViewModel
、イベントに応答するイベント ハンドラがありCustomerSelected
ます。ハンドラーはSelectedCustomer
からプロパティを読み取り、SelectCustomerViewModel
最後にIsSelectingCustomer
プロパティを false に戻して、モーダル コンテンツを閉じます。