使用异步方法使用InotifyPropertychanging的WPF结合



我是C#和WPF的新手,我正在尝试创建一个UI,该UI将读取和显示来自InfluxDB数据库的数据。我在获取在UI上显示数据时遇到困难。

这是我的代码外观的简化版本:

public class Model : INotifyPropertyChanged
{
    private int _count;
    public Model()
    {
    }
    public int Count
    {
        get
        {
            return this._count;
        }
        set
        {
            if (value != this._count)
            {
                this._count = value;
                NotifyPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            Console.WriteLine("change");
        }
    }
    public async Task<List<data>> Refresh()
    {
         Count++;
         //Database logic in here
    }

和在我的主窗口中绑定的XAML:

<Grid>
            <Grid.DataContext>
                <local:Model/>
            </Grid.DataContext>
            <TextBlock Text="{Binding Path=Count, UpdateSourceTrigger=PropertyChanged}"/>         
</Grid>

如果我在模型的构造函数中设置值,则值在UI上显示,但是当我调用刷新方法时,值永远不会更新。我对绑定有什么错,这可能与该方法异步有关的事实有关?

XAML对情况敏感。您的属性应为Count(而不是计数(,或者您的XAML应参考<TextBlock Text="{Binding Path=count, UpdateSourceTrigger=PropertyChanged}"/>

要回答您对刷新方法和异步/等待的关注,请注意,将捕获执行刷新的executionContext(thread(,以便恢复同一线程上的工作。这意味着只要没有创建额外的线程(然后在后台执行Refresh();,您就可以安全地更新count。请注意,如果使用await blabla.ConfigureAwait(false);,则可以选择一个非UI线程,该线程应用于库代码,而不是用于UI级别代码。

最新更新