C# 带有IsAsync数据绑定don';在滚动和排序时不保留值

C# 带有IsAsync数据绑定don';在滚动和排序时不保留值,c#,wpf,.net-core,C#,Wpf,.net Core,首先,这是一个演示问题的gif: 正如您所见,每次滚动或按列排序时,都会重新计算生成所需时间的更新值 这是我的XAML代码的浓缩版本: 这是我的C代码的浓缩版本: public主窗口() { 初始化组件(); var pkgs=新列表{ 新Chromium()、新Firefox()、新Chromium()、新Firefox(), 新Chromium()、新Firefox()、新Chromium()、新Firefox(), 新Chromium()、新Firefox()、新Chromium()

首先,这是一个演示问题的gif:

正如您所见,每次滚动或按列排序时,都会重新计算生成所需时间的更新值

这是我的XAML代码的浓缩版本:


这是我的C代码的浓缩版本:

public主窗口()
{
初始化组件();
var pkgs=新列表{
新Chromium()、新Firefox()、新Chromium()、新Firefox(),
新Chromium()、新Firefox()、新Chromium()、新Firefox(),
新Chromium()、新Firefox()、新Chromium()、新Firefox(),
};
DgPackages.ItemsSource=pkgs;
}
最后,实例化的类:

抽象类包
{
public bool IsSelected{get;set;}=false;
public bool IsUpdated=>GetAvailableVersion()。结果为“Chromium”;
公共覆盖字符串信息=>“Chromium ipsum”;
受保护的重写异步任务GetAvailableVersion()
{
等待任务。延迟(200);
返回1;
}
受保护的重写异步任务GetInstalledVersion()
{
等待任务。延迟(200);
返回1;
}
}
Firefox类几乎与Chromium相同


您知道如何修复它吗?

属性不应该启动异步操作。这不是
IsAsync
属性的用途

当项目滚动到视图中时,将调用每个
包的getter。如果不想重新计算该值,则应捕获该值:

private bool? _isUpdated;
public bool IsUpdated
{
    get
    {
        if (_isUpdated.HasValue)
            return _isUpdated.Value;
        _isUpdated = GetAvailableVersion().Result <= GetInstalledVersion().Result;
        return _isUpdated.Value;
    }
}
private bool_更新信息;
公共图书馆更新
{
得到
{
如果(_isUpdated.HasValue)
返回_isUpdated.Value;

_isUpdated=GetAvailableVersion().Result属性不应该启动异步操作。这不是
IsAsync
属性的作用。每个
包的getter都将被调用。嗯,但您从不缓存GetAvailableVersion和GetInstalledVersion…所以显然每次调用getter IsUpdate时,都会再次调用它们…我不知道“不明白什么让你困惑缓存几乎解决了这个问题,谢谢!但我在滚动或按列排序时总是会有微延迟。由于移动滑块时的虚拟化,可见元素会绑定到不同的元素,并调用getter。但不要关闭虚拟化,缓存是更好的选择。