我有一些可重用的ContentControl,它在另一个视图中充当伪模式弹出窗口。
实例化时,ContentControl中会有一个自定义ContentTemplate,绑定到某个ViewModel并表示“模式弹出窗口”的内容。
<Dialogs:ModalDialog DialogHost="{Binding ElementName=layoutRoot, Mode=OneTime}"
Content="{Binding ViewModel.CurrentEditItem}"
IsShown="{Binding ViewModel.IsInEdit}">
<Dialogs:ModalDialog.ContentTemplate>
<DataTemplate>
<ItemEditor:ItemEditorView />
</DataTemplate>
</Dialogs:ModalDialog.ContentTemplate>
</Dialogs:ModalDialog>
public interface ICloseMe
{
event EventHandler<EventArgs> CloseMe;
}
每当CloseMe事件被触发时,应该通过将其VisibilityProperty设置为Hidden来“关闭”周围的ModalDialog。
弹出窗口中的视图(这里是ItemEditorView)不应该关心它是否显示在ModalDialog或其他上下文中,也就是说,它甚至不应该知道这样的类存在。这不包括遍历逻辑树或可视化树。
当按下取消/保存按钮时,它只能触发CloseMe事件。
此外,不应该在实例化ModalDialog的视图中实现/配置该机制,该视图应该尽可能地哑。
相反,“outer”ModalDialog应该做活动部分并收听CloseMe事件。
如何以一种相当干净、符合MVVM的方式实现这一点,并且不引入不必要的依赖关系?如果ContentTemplate的根扩展了ICloseMe,那么ModalDialog是否有任何事件会在ContentTemplate初始化后发生?