Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用INotifyPropertyChanged from async方法的WPF绑定_C#_Wpf_Asynchronous_Binding - Fatal编程技术网

C# 使用INotifyPropertyChanged from async方法的WPF绑定

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

我对C#和WPF完全陌生,我正在尝试创建一个UI,它将从xdb数据库读取和显示数据。我在获取要在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
    }
公共类模型: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属性?