C# MVVM+WPF弹出窗口未打开
XAML 在视图模型中: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
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内容。调用,但对于已更改的业务逻辑集合,我可以做什么?