C# 使用INotifyPropertyChanged from async方法的WPF绑定
我对C#和WPF完全陌生,我正在尝试创建一个UI,它将从xdb数据库读取和显示数据。我在获取要在UI上显示的数据时遇到问题 下面是我的代码的简化版本:C# 使用INotifyPropertyChanged from async方法的WPF绑定,c#,wpf,asynchronous,binding,C#,Wpf,Asynchronous,Binding,我对C#和WPF完全陌生,我正在尝试创建一个UI,它将从xdb数据库读取和显示数据。我在获取要在UI上显示的数据时遇到问题 下面是我的代码的简化版本: public class Model : INotifyPropertyChanged { private int _count; public Model() { } public int Count { get { return thi
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
}
公共类模型:INotifyPropertyChanged
{
私人国际单位计数;
公共模型()
{
}
公共整数计数
{
得到
{
把这个还给我;
}
设置
{
如果(值!=此.\u计数)
{
这个。_count=值;
NotifyPropertyChanged();
}
}
}
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
控制台。写入线(“更改”);
}
}
公共异步任务刷新()
{
计数++;
//这里有数据库逻辑
}
以及我的主窗口中绑定的XAML:
<Grid>
<Grid.DataContext>
<local:Model/>
</Grid.DataContext>
<TextBlock Text="{Binding Path=Count, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
如果我在模型的构造函数中设置了值,这些值会显示在UI上,但在调用refresh方法时,这些值永远不会更新。
绑定有什么问题,可能与方法是异步的有关吗?XAML区分大小写。属性应该是
Count
(而不是Count),或者XAML应该引用
要回答有关刷新方法和异步/等待的问题,请注意,执行刷新的ExecutionContext(线程)将被捕获,以便在同一线程上恢复工作。这意味着只要没有创建额外的线程,然后执行
Refresh()
在后台,您可以安全地更新您的计数。请注意,如果使用等待blablabla.ConfigureAwait(false),则可能会选择非UI线程;
应该用于库代码,但不用于UI级代码。很抱歉,在修改我的问题代码时出错了。我的属性应该是Count
。我将在原始问题中更新它。它在我这方面工作得非常好。我能想到的唯一问题是您意外地增加了字段(不包括在变更通知中)而不是属性。请注意,在计数绑定上设置UpdateSourceTrigger=PropertyChanged
是毫无意义的。它只对源绑定有双向或单向的影响,并且与INotifyPropertyChanged接口的PropertyChanged事件无关。绑定将Grid.DataContext
中的模型实例用作您是否也设置了此实例的Count属性,或者设置了其他实例的Count属性?