现在,我可以获取一个View来实例化其上方的另一个View,就像DialogueBox一样吗?

时间:2009-07-08 15:10:54

标签: wpf mvvm

我刚刚为我的WPF / MVVM 应用程序完成了一个“对话框解决方案”,其中ViewModel更改了其ViewModel特性,并且View使用触发器进行相应显示并隐藏对话框等。从用户体验的经验来看,这是令人满意的。

但是,我使用的“对话框”是边框元素,可以在可见之间切换可见性属性折叠,所以它并没有真正“弹出”,而只是“弹出”应用程序。

所以我想扩展我的解决方案,以便对话框实际上弹出,就像经典 MessageBox 一样。

目前我有这个:

<Style x:Key="DialogueBoxDelete" TargetType="Border">
    <Style.Triggers>
        <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="show">
            <Setter Property="Border.Visibility" Value="Visible"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="hide">
            <Setter Property="Border.Visibility" Value="Collapsed"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

由于我理解MVVM的可测试性很重要,我的ViewModel不会实例化我的DialogueBox视图,而是我的 View实例化DialogueBox视图,我想我需要这样的东西:

伪码:

<Style x:Key="DialogueBoxDelete" TargetType="Border">
    <Style.Triggers>
        <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="show">
            <InstantiateDialogueWindow .../>
        </DataTrigger>
        <DataTrigger Binding="{Binding DialogueBoxDeleteStatus}" Value="hide">
            <RemoveWindow.../>
        </DataTrigger>
    </Style.Triggers>
</Style>

但这是什么语法? 我的UserControl如何实例化浮动在当前应用程序之上的另一个窗口?

1 个答案:

答案 0 :(得分:1)

易于代码隐藏。只需new Window(),设置其ContentOwner属性,然后致电Show()

如果你正在寻找一种方法在XAML中这样做,我不确定是否有一个。我知道你不能将<Window>元素嵌入为XAML子节点(我已尝试过)。您可以查看Popup控件,但这并不理想,因为它没有标题栏,调整边框大小等等。它可以扩展到窗口的边框之外,但是否则它不会是任何比你的边境更好。它看起来不像是一个对话框。

但老实说,我不确定我会从View中做到这一点。您可能需要考虑让ViewModel(毕竟具有所有显示逻辑)决定何时以及如何显示更多GUI。请参阅this question,了解如何从ViewModel显示GUI(不要使ViewModel依赖于View代码)。