我在使用绑定和异步方法的UWP(Windows 10)中遇到问题。我有一个绑定到一个布尔isDay
的复选框。当我更改isDay
时,复选框也会更改其状态。
我在XAML中的代码如下所示:
IsChecked="{x:Bind isDay, Mode=TwoWay}"
在异步方法中更改isDay
时,复选框不会更改其状态。
如何使此绑定与异步方法一起使用?
答案 0 :(得分:2)
根据我的经验,复选框不会改变的根本原因是UI线程上没有触发的属性更改通知。我相信UWP吞下了失败,而不是抛出关于从不同线程访问某些东西的例外。"
如果您已经可以轻松访问Dispatcher
(您的代码隐藏或其他视图级别组件),那么您可以执行以下操作:
private async void ClickHandler(object sender, EventArgs args)
{
bool checked = await SomeAsyncWorkThatReturnsBool().ConfigureAwait(false);
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => checkbox.IsChecked = checked);
}
Dispatcher
?更有可能的是,由于视图模型,模型或其他图层中的异步工作无法实际访问Dispatcher
(或正确的{{1}当有多个时)。在过去,我使用依赖注入并抽象接口以使我的视图模型访问UI线程,但这可以说是代码味道。
我当前最喜欢的方法(会喜欢反馈)是在活动注册期间捕获Dispatcher
,并使用它来发布更改事件。
SynchronizationContext
答案 1 :(得分:0)
由于某些原因,当通过异步方法更新值时,绑定不会更新。所以,在异步方法结束时我只使用:
Bindings.Update();
和控件使用最新值进行更新。
答案 2 :(得分:-1)
默认情况下,自动生成的XAML代码不支持等待方法,因此您无法使用Task<T>
方法在XAML中进行绑定。