我是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级别代码。