如何使ContentControl在其ContentTemplate中侦听非路由事件

时间:2009-12-07 13:23:39

标签: c# wpf data-binding mvvm datatemplate

我有一些可重用的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>

现在我想达到以下目的:ContentTemplate的根目录(此处为:ItemEditorView)应该实现以下接口。

public interface ICloseMe
{
  event EventHandler<EventArgs> CloseMe;
}

每当触发CloseMe-Event时,应通过将其VisibilityProperty设置为Hidden来“关闭”周围的ModalDialog。

弹出窗口中的视图(此处为ItemEditorView)不应该关心它是否显示在ModalDialog或其他上下文中,即它甚至不应该知道这样的类存在。这不包括遍历逻辑或可视树。 当按下取消/保存按钮时,它只会触发CloseMe-Event。

此外,不应在实例化ModalDialog的视图中实现/配置该机制,视图应尽可能愚蠢。

相反,“外部”ModalDialog应该执行活动部分并侦听CloseMe事件。 如何以一种相当干净,符合MVVM的方式实现它,而不会引入不必要的依赖?是否有任何事件,在初始化ContentTemplate后发生,s.t。然后ModalDialog可以评估,如果它的根扩展ICloseMe?

1 个答案:

答案 0 :(得分:0)

如何使ICloseMe包含一个Closed属性,您可以在XAML中设置触发器?