gpt4 book ai didi

mvvm - PerformanceProgressBar "Invalid cross-thread access"异常

转载 作者:行者123 更新时间:2023-12-03 11:00:31 25 4
gpt4 key购买 nike

我正在开发 WP7 应用程序。我遇到了一些意想不到的行为。我在我的应用程序的几个页面中使用 SilverLight 工具包中的 PerformanceProgressBar。这些 PerformanceProgressBar 绑定(bind)到名为 IsBusy 的 ViewModel 属性。每个页面都有自己的 ViewModel。
....<toolkit:PerformanceProgressBar
VerticalAlignment="Top"
HorizontalAlignment="Left"
IsIndeterminate="{Binding IsBusy}"
Visibility="{Binding IsBusy, Converter={StaticResource BoolToVisibilityConverter}}"

/>......

    public bool IsBusy
{
get
{
return this._isBusy;
}
set
{
if (value == this._isBusy)
{
return;
}

this._isBusy = value;
RaisePropertyChanged("IsBusy");
}
}

当我更改 IsBusy 值时,我得到“无效的跨线程访问”异常。

有任何想法吗?

最佳答案

对可视化树(即应用程序的 UI)的任何更改都必须从 UI 线程执行。这包括通过绑定(bind)对属性进行的更改。我的猜测是您正在通过后台线程更新此属性?

在这种情况下,您需要通过 Dispatcher 将属性更改编码到 UI 线程。

public bool IsBusy
{
get
{
return this._isBusy;
}
set
{
if (value == this._isBusy)
{
return;
}

Application.Current.Dispatcher.BeginInvoke(() => {
this._isBusy = value;
RaisePropertyChanged("IsBusy");
});
}
}

这会将 View 暴露给您的 View 模型,因此不是很好的 MVVM!在这种情况下,我会将调度程序“隐藏”在您提供给 ViewModel 的单个方法接口(interface) IMarshalInvoke 后面。

或者考虑使用 BackgroundWorker,它可以为您在 UI 线程上触发 ProgressChanged 事件。

关于mvvm - PerformanceProgressBar "Invalid cross-thread access"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8937525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com