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

发布于 2024-08-13 23:21:57 字数 1228 浏览 3 评论 0原文

我有一些可重用的 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 被触发时,周围的 ModalDialog 应该通过将其 VisibilityProperty 设置为 Hidden 来“关闭”。

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

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

相反,“外部”ModalDialog 应该执行活动部分并侦听 CloseMe 事件。 我怎样才能以一种相当干净、符合 MVVM 的方式实现这一点,而不引入不必要的依赖项?初始化 ContentTemplate 之后是否有任何事件发生,如果 ModalDialog 的根扩展了 ICloseMe,则 ModalDialog 可以评估该事件?

I have some reusable ContentControl, which acts as a pseudo-modal popup inside another view.
It is always there and only its visibility makes it appear or disappear.
When instantiated, within the ContentControl there will be a custom ContentTemplate, bound to some ViewModel and representing the content of the "modal popup".

<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>

Now I want to reach the following: the root of the ContentTemplate (here: ItemEditorView) should implement the following interface.

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

Whenever the CloseMe-Event is fired, the surrounding ModalDialog should be "closed" by setting its VisibilityProperty to Hidden.

The view within the popup (here ItemEditorView) should not care, whether it is shown in a ModalDialog or another context, i.e. it should not even know that such class exists. This excludes a walk through the Logical or Visual tree.
It shall only fire the CloseMe-Event, when Cancel/Save-Buttons are pressed.

Further, the mechanism should not be implemented/configured in the view instantiating the ModalDialog, the view should be as dumb as possible.

Instead, the "outer" ModalDialog should do the active part and listen to the CloseMe-event.
How can I implement this in a rather clean, MVVM-compliant way and without introducing unnecessary dependencies? Is there any event, occuring after a ContentTemplate is initialized, s.t. the ModalDialog could then evaluate, if the root of it extends ICloseMe?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多彩岁月 2024-08-20 23:21:57

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

How about making the ICloseMe include a Closed property that you could setup a trigger against in the XAML?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文