【问题标题】:ListView not updating after RaiseCanExecuteChanged is called调用 RaiseCanExecuteChanged 后 ListView 未更新
【发布时间】:2010-01-25 09:39:49
【问题描述】:

我有一个绑定到视图模型集合的 ListView。 Item 模板包含一个绑定到视图模型上的命令的按钮。当我设置 ListView 的 ItemsSource 的属性时,我为每个视图模型调用 RaiseCanExecuteChanged。

public BindingList<IVehicleViewModel> Vehicles 
    {
        get { return _vehicles; }
        set 
        { 
            if(_vehicles == value) return;
            _vehicles = value;
            OnPropertyChanged("Vehicles");
            RaiseCanExecuteChangedEvents();
        }
    }

尽管我已验证所有视图模型上的 CanExecute 都返回 true,但该按钮显示为灰色。 我唯一注意到的是,如果我在列表视图已经被渲染时调用 RaiseCanExecuteChanged,一切都会按预期工作,如果我在列表视图被渲染之前调用它,然后滚动浏览它们自己整理的项目。

【问题讨论】:

    标签: wpf listview mvvm itemtemplate


    【解决方案1】:

    有一个静态方法 CommandManager.InvalidateRequerySuggested 会强制重新评估命令的可执行性(这是一个词吗?),只要您想确保您的 UI 更新以反映您的命令的 CanExecute 结果的变化,请尝试调用它。

    【讨论】:

    • 我创建了一个调用 CommandManager.InvalidateRequerySuggested(); 的命令它似乎根本没有调用 CanExecute 吗?我是 Microsoft.Practices.Composite.Presentation.Commands 的 DelegateCommand
    • 在 RaiseCanExecuteChangedEvents() 我添加了 Thread.Sleep(1000);这似乎解决了这个问题。似乎我怀疑您必须在屏幕上呈现控件后调用 RaiseCanExecuteChangedEvents() 。显然,这不是解决问题的可接受方式。
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2012-03-13
    • 2019-08-25
    相关资源
    最近更新 更多