对WPF数据网格进行排序是通过IsAsync绑定挂起整个GUI



我的WPF应用程序中有这个IsUpdated属性:

public bool IsUpdated
{
get
{
if (_isUpdated.HasValue)
{
return _isUpdated.Value;
}
var available = GetAvailableVersion().Result;
var installed = GetInstalledVersion().Result;
_isUpdated = IsInstalled && new Version(available).CompareTo(new Version(installed)) <= 0;
return _isUpdated.Value;
}
}

GetAvailableVersion((和GetInstalledVersion((方法是异步的。

这就是我在XAML中绑定它的方式:

<DataGridTemplateColumn Header="Updated" Width="96" CanUserSort="True" SortMemberPath="IsUpdated">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="MyImage" Source="Assets/States/Loading.ico" VerticalAlignment="Center" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsUpdated, IsAsync=True}" Value="False">
<Setter TargetName="MyImage" Property="Source" Value="Assets/States/False.ico" />
</DataTrigger>
<DataTrigger Binding="{Binding IsUpdated, IsAsync=True}" Value="True">
<Setter TargetName="MyImage" Property="Source" Value="Assets/States/True.ico" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

当IsUpdated属性仍在加载时,我无法按列排序,它挂起,有时会崩溃。

你知道我怎样才能解决这个棘手的问题吗?

我不知道你是不是这样做的,但这对我来说很好。也许您需要在为字段指定值后激发已更改的属性。在异步操作完成之前,该字段为null。当最终检索到值时,应该通知UI。

if (!_field.HasValue)
{
Task.Run(() => <DoAsyncStuff>)
.ContinueWith(task =>
{
if (task.IsFaulted)
{
<Error>
}
else
{
_field = task.Result
}
}, TaskScheduler.FromCurrentSynchronizationContext());  
}
return _field;

FromCurrentSynchronizationContext很重要,您需要再次在UI线程上使用ContinueWith,否则您将不会更改任何属性。

最新更新