c# - INotifyPropertyChanged 绑定(bind)和跨线程错误

标签 c# user-interface multithreading

我的 GUI 上有一个绑定(bind)到数据源的 GridView 元素。我决定使用 INotifyPropertyChanged,因为它允许我修改一个会自动更新 GridView 的类,从而简化交互。 到目前为止,我没有遇到任何问题使用跨线程,但现在我添加了另一个方法来修改我的类(这又修改了 GridView),但这是在非 UI 线程上进行的。我之前使用 invoke 解决了我的问题,但我不确定在实现 INotifyPropertyChanged 并将其绑定(bind)到 GridView< 时如何处理它。非常感谢任何帮助!

最佳答案

假设您有一个绑定(bind)到网格的可观察集合。网格就是 View 。

当进行调出以检索数据时,调出将异步返回数据。在 Async 事件处理程序上,您可能希望在 View Model 类中有类似这样的内容:

    /// <summary>
    /// This is what is bound to the UI
    /// </summary>
    private ObservableCollection<UserDTO> _Users;

    /// <summary>
    /// Collection of Users
    /// </summary>
    public ObservableCollection<UserDTO> Users
    {
        get
        {
            return _Users;
        }
        set
        {
            if (_Users != value)
            {
                _Users = value;
                OnPropertyChanged("Users");
            }
        }
    }

    /// <summary>
    /// Asynchronous Callback For Get Users
    /// </summary>
    private void UserAgentGetCompleted(object sender, List<UserDto> users)
    {

         //Make sure we are on the UI thread
          this.Dispatcher.BeginInvoke(() => SetUsers(users));

    }

然后在 SetUsers 中,您将更新数据绑定(bind)到 View (网格)的可观察集合 (_Users)。由于可观察集合更新,更改将反射(reflect)在 View 中,因为它通过依赖属性绑定(bind)到 View 。

请注意,我省略了 SetUsers() 代码,但所做的只是将传入用户列表设置为可观察集合。

关于c# - INotifyPropertyChanged 绑定(bind)和跨线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792718/

相关文章:

android - 在单独的线程上访问 SharedPreferences

c# - 当调用程序集是 .NET Framework 4.7.2 时,.NET Standard 库将目标预处理器设置为 NETSTANDARD2_0?

c# - 单击按钮时图像移动

c# - 尝试将 Autofac 作为嵌入式程序集加载时出现 FileNotFoundException

multithreading - 在 Go 中关闭自馈 channel

python - __init__() 获得意外的关键字参数 'conne'

c# - Awesomium.NET 在调整大小时崩溃 - 内存泄漏

user-interface - uwp 命令栏总是显示标签

.net - WPF UI 更新细节

python - Tkinter 复选按钮不起作用