由于视图和模型视图对象实例化,我分心了。举个例子: 我使用 listview LV 和一个按钮查看V 。按钮是绑定命令,作为参数 listview LV 。命令 CanExecute 方法检查 listView LV 是否包含元素。但是当我打开视图V 时,视图模型对象会在视图V 之前创建。因此,当 CanExecture 方法检查 listView 时,它为空,我的按钮永远不会变得不可用。
如何解决这个问题?
编辑: 命令实现:
public class DelegateCommand : ICommand
{
public event EventHandler CanExecuteChanged;
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
if (execute == null)
{
throw new ArgumentNullException(nameof(execute));
}
this._execute = execute;
this._canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
答案 0 :(得分:0)
对于那种命令实现,你必须手动调用RaiseCanExecuteChanged()
(在你的情况下,在列表视图获得项目之后)。
您还可以将CanExecuteChanged
事件的实施更改为:
[...]
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
[...]
该实现使命令管理器能够自动评估CanExecute。