Windows phone 7 在WP7上使用MVVM时,如何最好地将弹出窗口添加到可视化树中

Windows phone 7 在WP7上使用MVVM时,如何最好地将弹出窗口添加到可视化树中,windows-phone-7,popup,Windows Phone 7,Popup,我在WP7上通过Caliburn Micro使用MVVM。我有一个弹出窗口,显示从虚拟机。弹出窗口上有一个性能进度条。当IsIndeterminate设置为true时,进度条不显示,因为弹出窗口不在可视化树中(它是一个自定义控件) 如果我从视图模型中抓取视图并强制弹出到可视化树中,进度条将正确显示。不过我真的不想这么做 在保持视图和视图模型分离的同时,最好的方法是什么。是否有某种方法可以将弹出窗口插入根页面或框架?我的方法是使用视图模型公开的子视图模型/控制器/事件源并绑定到控件 控件可以监听源

我在WP7上通过Caliburn Micro使用MVVM。我有一个弹出窗口,显示从虚拟机。弹出窗口上有一个性能进度条。当IsIndeterminate设置为true时,进度条不显示,因为弹出窗口不在可视化树中(它是一个自定义控件)

如果我从视图模型中抓取视图并强制弹出到可视化树中,进度条将正确显示。不过我真的不想这么做


在保持视图和视图模型分离的同时,最好的方法是什么。是否有某种方法可以将弹出窗口插入根页面或框架?

我的方法是使用视图模型公开的子视图模型/控制器/事件源并绑定到控件

控件可以监听源代码上的事件来完成它的工作,它被很好地分离,甚至可以进行单元测试


这方面的一个很好的例子是my,视图模型使用Display和Clear等方法公开StatusSource。控件本身绑定到源并侦听更改。从那里你可以做任何事情,包括创建弹出窗口并将其插入到可视化树中。

你正在与设计师合作吗?我发现在代码中执行任何基于视图的操作,而不是加载数据,都会混淆和/或阻碍它们。我建议创建两个视觉状态,一个显示弹出窗口,一个隐藏,这样设计师可以看到应用程序的外观,并可以在Blend中切换(和样式)弹出窗口。然后,我使用DataStateBehavior或DataStateSwitchBehavior从我的VM控制弹出窗口。

我最终创建了一个基本弹出窗口类,并将此代码添加到:

private void HookIntoPage()
{
    if (UserControlHelper.RootVisual != null)
    {
        PhoneApplicationPage page = (PhoneApplicationPage)UserControlHelper.RootVisual.Content;

        // Hook up into the back key press event of the current page
        page.BackKeyPress += BackKeyPress;

        FrameworkElement element = page.FindVisualChild("MainGrid");

        if (element != null && element is Grid)
        {
            Grid grid = element as Grid;
            grid.Children.Add(this);
        }
        else
        {
            throw new Exception("Popup cannot find MainGrid");
        }
    }
}
它有点硬编码,因为它寻找一个主网格控件。这可以改进以寻找合适的顶级容器

这里有两个助手类。UserControlHelper具有以下方法:

public static PhoneApplicationFrame RootVisual
{
    get
    {
        return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;
    }
}

FindVisualChild来自Phone7.Fx.preview附带的VisualTreeHelperExtension类,我将其用于可绑定的应用程序栏。

好主意-将在页面VM和控件之间放置一个子VM。我仍然需要一种方式,弹出可以插入自己的视觉树。我应该能够使用RootVisual做一些事情——PhoneApplicationPage或PhoneApplicationFrame。这样,弹出窗口可以在任何地方使用。只是看不到如何做到这一点?据我所知,从我使用的弹出窗口来看,它根本不是视觉树的一部分(这可能会导致方向问题)。您可以创建一个弹出窗口,将其子控件设置为您的控件,然后调用show,而无需添加到可视化树中。一个例子是在Yes you can,这就是我正在做的,但后来我添加了一个进度条,但它不起作用。当我将弹出窗口添加到可视化树中时,进度条开始工作。奇怪的是,我没有遇到这个问题,对不起,我帮不上忙。弹出窗口本身显示和隐藏都很好。但进度条不起作用。我需要一个通用的方式插入到视觉树弹出窗口。一旦我得到了它,我就可以创建一个基本的弹出控件,我的其他弹出控件可以从中继承。