我是链接ModalContentPresenter
控件的作者,因此我将尝试解决您的一些问题和疑虑。
我需要在同一个视图上编写父视图 XAML 和模态 XAML。
您实际上可以将两个视图写入单独的文件中。然后可以动态加载视图DataTemplates
,这取决于ViewModel
绑定到Content
或ModalContent
属性的 。
请参阅this,它描述了可以实现此视图切换的一般方式。
你可以有一个MainViewModel
which 有两个属性,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
绑定到ModalContent
属性的 (在显示它之前通过设置IsModal
为true
)一样简单。只要您有一个绑定的DataTemplate
for ViewModel
(并且您的MainViewModel
实现INotifyPropertyChanged
正确),就会显示正确的内容。
我想在哪里使用模态弹出窗口的一些例子是:
在视图上放置一个按钮以选择客户端。它应该打开一个包含所有可能客户端的弹出窗口并让用户选择一个。
将产品弹出窗口添加到客户订单。
一旦你理解了上面描述的技术,你应该能够看到,只要你有一个View
和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,从而关闭模态内容。