Wpf 调用RaiseCanExecuteChanged后ListView未更新
我有一个绑定到视图模型集合的ListView。项目模板包含绑定到视图模型上的命令的按钮。当我设置ListView的ItemsSource为每个viewmodel调用的RaiseCanceTechChanged属性时Wpf 调用RaiseCanExecuteChanged后ListView未更新,wpf,listview,mvvm,itemtemplate,Wpf,Listview,Mvvm,Itemtemplate,我有一个绑定到视图模型集合的ListView。项目模板包含绑定到视图模型上的命令的按钮。当我设置ListView的ItemsSource为每个viewmodel调用的RaiseCanceTechChanged属性时 public BindingList<IVehicleViewModel> Vehicles { get { return _vehicles; } set { if(_vehicles
public BindingList<IVehicleViewModel> Vehicles
{
get { return _vehicles; }
set
{
if(_vehicles == value) return;
_vehicles = value;
OnPropertyChanged("Vehicles");
RaiseCanExecuteChangedEvents();
}
}
公共绑定列表车辆
{
获取{返回_车辆;}
设置
{
如果(_vehicles==值)返回;
_车辆=价值;
不动产变更(“车辆”);
RaiseCanExecuteChangedEvents();
}
}
尽管我已经验证了在所有视图模型上CanExecute返回true,但按钮显示为灰色。
我注意到的唯一一件事是,如果我在listview已经呈现时调用RaiseCanExecuteChanged,一切都会按预期进行,如果我在listview呈现之前调用它,然后滚动它们自己排序的项目。有一个静态方法
CommandManager.invalidateRequestSuggested
强制重新评估命令的可执行性(这是一个词吗?)只要您想确保UI更新以反映命令执行结果中的更改,请尝试调用该命令。我创建了一个调用CommandManager.InvalidateRequestSuggested()的命令;它似乎根本不叫CanExecute?我是Microsoft.Practices.Composite.Presentation.Commands中的DelegateCommand在raiseCanceTechChangedEvents()中,我添加了行Thread.Sleep(1000);这似乎解决了问题。我似乎怀疑,在屏幕上呈现控件后,必须调用RaiseCanceTechChangedEvents()。显然,这不是一个可以接受的解决问题的方法。