C# MVVM+WPF弹出窗口未打开

C# MVVM+WPF弹出窗口未打开,c#,wpf,xaml,mvvm,popup,C#,Wpf,Xaml,Mvvm,Popup,XAML 在视图模型中: private bool _PopUpIsOpen; public bool PopUpIsOpen { get { return _PopUpIsOpen; } set { _PopUpIsOpen = value; RaisePropertyChanged(() => this.PopUpIsOpen); } } public RelayCommand SubmitCommand { ge

XAML

在视图模型中:

private bool _PopUpIsOpen;

public bool PopUpIsOpen
{
    get { return _PopUpIsOpen; }
    set
    {
        _PopUpIsOpen = value;
        RaisePropertyChanged(() => this.PopUpIsOpen);
    }
}

public RelayCommand SubmitCommand { get; private set; }

private bool SubmitCommandCanExecute()
{
    return true;
}

private void SubmitCommandExecute()
{

    PopUpIsOpen = true;

    dsStandardListbyMarket = marketBL.StandardListbyMarketBL(Convert.ToInt32(SelectdMarketId), Convert.ToInt32(Users.UserId));
    GetComboboxMappingCollections(Convert.ToInt32(this.SelectdMarketId), Users.UserId);
    FItems = new ObservableCollection<MarketRecord.FItem>();
    FItems.CollectionChanged += OnUICollectionChanged;
    marketBL.FetchMarketRecords(Convert.ToInt32(this.SelectdMarketId));
    IsSubmitButtonVisible = true;

    PopUpIsOpen = false;
}

当我点击submit按钮时,控件进入SubmitCommandExecute,但弹出窗口不显示。我对WPF有点陌生,对它摸不着头脑。最后在这里提出这个问题。可能有什么问题。

鉴于msdn上的属性更改语法的原因:

protected internal void RaisePropertyChanged (
   string propertyName
)

你应该试着打开RaisePropertyChangedPopUpIsOpen;而不是RaisePropertyChanged=>this.PopUpIsOpen

鉴于msdn上的属性更改语法的原因:

protected internal void RaisePropertyChanged (
   string propertyName
)

你应该试着打开RaisePropertyChangedPopUpIsOpen;而不是RaisePropertyChanged=>this.PopUpIsOpen

我认为问题在于您测试代码的方式。由于您在UI线程中睡眠,UI不会感觉到绑定属性从true到false的变化。
试着在线程中使用计时器而不是睡眠。

我认为问题在于测试代码的方式。由于您在UI线程中睡眠,UI不会感觉到绑定属性从true到false的变化。
尝试在线程中使用计时器而不是睡眠。

在运行时是否检查了Visual Studio中的输出窗口?有任何绑定错误吗?如果在XAML中手动设置IsOpen=true,弹出窗口是否正确显示?您正在暂停UI线程,因此无法看到显示的弹出窗口。您是否尝试删除PopUpIsOpen=false,只是为了查看它是否有效?是否在运行时检查了Visual Studio中的输出窗口?有任何绑定错误吗?如果在XAML中手动设置IsOpen=true,弹出窗口是否正确显示?您正在暂停UI线程,因此无法看到显示的弹出窗口。您是否尝试删除PopUpIsOpen=false,只是为了看看它是否有效?OP可能使用了一些允许这种语法糖的MVVM引擎。OP可能使用了一些允许这种语法糖的MVVM引擎。我接受您的答案。如果我在睡眠后删除PopUpIsOpen=false,则会显示弹出窗口。但如果我也调用业务逻辑,它并没有显示它,而是从业务逻辑返回。为什么?那次我没有暂停UI线程,对吗?>您应该让您的业务逻辑在自己的线程中工作,例如后台工作线程。我猜你在用caliburn我错了吗,尝试使用协同程序来驱动您的计算。我已经更新了我的问题>我已经尝试了后台工作人员。由于FItems.CollectionChanged+=OnUICollectionChanged,我给出了一个异常;这是一个类似的代码。当这个调用转到另一个线程时,它抛出异常!这很正常,您应该了解如何使用Dispatcher.Invoke以便将工作线程封送到UINo,而不仅仅是UI。我已marketBL.AppDataModel.items.CollectionChanged+=OnAppModelCollectionChanged;在我的视图模型构造函数中定义。因此,当我调用marketBL.FetchMarketRecordsConvert.ToInt32this.SelectdMarketId;在提交命令中。它更新了我的业务层集合,它在单独的线程中运行。即使这样,我也有例外。我可以与dispatcher共享UI内容。调用,但我可以为业务逻辑集合更改做什么?我接受您的答案。如果我在睡眠后删除PopUpIsOpen=false,则会显示弹出窗口。但如果我也调用业务逻辑,它并没有显示它,而是从业务逻辑返回。为什么?那次我没有暂停UI线程,对吗?>您应该让您的业务逻辑在自己的线程中工作,例如后台工作线程。我猜你在用caliburn我错了吗,尝试使用协同程序来驱动您的计算。我已经更新了我的问题>我已经尝试了后台工作人员。由于FItems.CollectionChanged+=OnUICollectionChanged,我给出了一个异常;这是一个类似的代码。当这个调用转到另一个线程时,它抛出异常!这很正常,您应该了解如何使用Dispatcher.Invoke以便将工作线程封送到UINo,而不仅仅是UI。我已marketBL.AppDataModel.items.CollectionChanged+=OnAppModelCollectionChanged;在我的视图模型构造函数中定义。因此,当我调用marketBL.FetchMarketRecordsConvert.ToInt32this.SelectdMarketId;在提交命令中。它更新了我的业务层集合,它在单独的线程中运行。即使这样,我也有例外。我可以与dispatcher共享UI内容。调用,但对于已更改的业务逻辑集合,我可以做什么?