等到Visual Tree完成更新

时间:2015-09-03 08:50:26

标签: c# wpf mvvm

我在启动时打开对话框时收到此错误:Cannot perform this operation while dispatcher processing is suspended.

在应用程序开始时,将在具有可切换内容的窗口顶部打开“登录对话框”窗口。我的意思是我有一个窗口,通过在主窗口上设置ViewModel属性来切换内容。

如果我没有设置主窗口视图模型,我不会收到错误,因为它不需要在视图中更改任何内容。

这是MainView,带有可切换的viewmodel:

<Window x:Class="WpfProject.Views.Main.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ViewModels="clr-namespace:WpfProject.ViewModels.Main"
    Title="WpfProject" Height="700" Width="1000"
    Content="{Binding ViewModel}"
    Visibility="{Binding MainWindowVisiblility}"
    xmlns:MvvmDialogs="clr-namespace:MvvmDialogs.Behaviors;assembly=MvvmDialogs"
    MvvmDialogs:DialogBehavior.DialogViewModels="{Binding Dialogs}"
    xmlns:Behaviors="clr-namespace:WpfProject.Behaviors"

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
>
<i:Interaction.Behaviors>
    <Behaviors:CancelCloseWindowBehavior CloseAction="{Binding CloseAction}"></Behaviors:CancelCloseWindowBehavior>
</i:Interaction.Behaviors>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding StartUpProcedureCommand}"></i:InvokeCommandAction>
    </i:EventTrigger>
</i:Interaction.Triggers>

<Window.DataContext>
    <ViewModels:MainViewModel ></ViewModels:MainViewModel>
</Window.DataContext>

交互触发器是执行对话窗口的操作。

对于对话框窗口我使用Mark J Feldman处理对话框的方式,可以找到here

现在正如标题中所建议的那样,我想等到MainViewModel被更改并更新视图,然后再打开对话框窗口。

启动程序命令:

private ICommand _StartUpProcedureCommand;
public ICommand StartUpProcedureCommand
{
    get
    {
        return _StartUpProcedureCommand ?? (_StartUpProcedureCommand = new Command(StartUpProcedure));
    }
}
private void StartUpProcedure()
{

    UserLoginDialog();

}
private void UserLoginDialog(IUser user = null)
{

    MainWindowVisiblility = Visibility.Hidden;
    LoginViewModel lvm=new LoginViewModel(user);
    this.Dialogs.Add(lvm);
    if (lvm.Result == null)
        Application.Current.MainWindow.Close();

}

1 个答案:

答案 0 :(得分:0)

尽管他写了很长篇文章,但Mark的对话模式看起来像是一个非常丑陋且思路很差的解决方案。

您在UI线程上遇到了一种死锁,需要在Dispatcher.BeginInvoke中包装新窗口的显示,以便异步执行并允许调度程序线程继续处理。

这样的事情:

Dispatcher.BeginInvoke(new Action(() => new CustomDialogWindow {DataContext = parent.DataContext}.ShowDialog());