代码之家  ›  专栏  ›  技术社区  ›  Simon D.

如何使ContentControl侦听其ContentTemplate内的非路由事件

  •  0
  • Simon D.  · 技术社区  · 14 年前

    我有一些可重用的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初始化后发生?

    1 回复  |  直到 14 年前
        1
  •  0
  •   David    14 年前

    做点什么好吗 ICloseMe 包括 Closed