【问题标题】:Raise event on WPF DataGrid upon datasource change在数据源更改时在 WPF DataGrid 上引发事件
【发布时间】:2011-08-01 08:53:31
【问题描述】:

我正在开发一个 WPF MVVM 应用程序。我希望在绑定到我的数据网格的集合发生更改时触发某种事件。

例如:- 我的数据网格项目源是 ObservableCollection UserList

我希望当我清除 UserList 集合时,在 datagrid 上触发一些事件以通知自己。我已经尝试过datagrid的DataContextChanged这个事件,但是没有帮助。

请指导

谢谢

【问题讨论】:

  • 使用绑定而不是 itemsource 设置后面的代码

标签: wpf binding mvvm-light wpfdatagrid


【解决方案1】:

如果您遵循 MVVM 模式,则不需要处理 UI 事件。您的对象集合是 ViewModel 的一部分,因此您应该在 ViewModel 上添加一个 PropertyChanged 事件,该事件会在集合更改时触发。

【讨论】:

  • 是的,没错。但由于某种原因,我想将该事件处理到 GUI,无论如何我可以这样做,每当数据网格的源发生变化时,我都会收到通知。
【解决方案2】:

如果您使用的是 MVVM,那么您有这样的属性

        /// <summary>
    /// The <see cref="UserList" /> property's name.
    /// </summary>
    public const string UserListPropertyName = "UserList";
    private ObservableCollection<UserList> _userList = new ObservableCollection<UserList>();
    public ObservableCollection<UserList> UserList
    {
        get
        {
            return _userList;
        }
        set
        {
            if (_userList != value)
            {
                _userList = value;
                RaisePropertyChanged(UserListPropertyName);
            }
        }
    }

并且在setter部分你可以调用视图模型中的任何方法,如果你使用的是后面的代码,那么你就没有使用MVVM模式

【讨论】:

    【解决方案3】:

    如果您想要一个在对集合的引用更改时触发的事件,那么您应该在您的 ViewModel 中使用 OnPropertyChanged 事件,正如 Rumplin 所展示的那样。但是,如果您想知道何时将用户添加到集合中或从集合中删除,则需要为 ObservableCollection 上的 CollectionChanged 事件添加处理程序。

    【讨论】:

      【解决方案4】:

      您要查找的事件是CollectionChanged

      让您(以及其他尝试做同样事情的人)感到困惑的一个原因是您认为当集合发生变化时,您的数据网格的来源也发生了变化。不是这样。数据网格的 ItemsSource 仍然是集合 - 您尚未将其分配给不同的集合,或将其清除。所以PropertyChangedDataContextChanged 没有被提升,在这里处理它们没有任何效果。

      请注意,CollectionChanged 非常复杂,因为很多事情都构成了对集合的更改,因此您需要非常彻底地理解它才能正确处理它。我怀疑您实际上并不需要处理它 - 您正在尝试对可以通过绑定更好地完成的事件做一些事情。

      【讨论】:

      • 但是这个事件在视图模型上触发,实际上网格是我扩展的用户控件,我想在用户控件端处理这个事件。例如:- 修改集合时,将索引设置为 0,或者如果集合中没有任何记录,则将 cansort 列设置为 false 等
      猜你喜欢
      • 2023-03-07
      • 2016-02-23
      • 2012-06-22
      • 2014-08-28
      • 1970-01-01
      • 2023-04-10
      • 2016-03-29
      • 2016-10-06
      • 1970-01-01
      相关资源
      最近更新 更多