在我的ViewModel中,我實現了IDataErrorInfo接口(以及INotifyPropertyChanged)。輸入驗證按預期工作,我在那裏沒有問題。WPF命令與輸入驗證綁定 - 如何僅在所有輸入有效時啓用「保存」按鈕
我有這樣的屬性作爲IDataErrorInfo的public string Error { get { return this[null]; } }
的一部分,據我瞭解,Error
應該是空的,如果所有的驗證輸入通過驗證,所以我通過這個作爲我的CanExecute方法
return !string.IsNullOrEmpty(Error);
但是,我的「保存」按鈕從未啓用。我的感覺是,CanExecuteChanged
從來沒有得到激怒。如果那是真的,我應該在哪裏以及如何觸發它?
這是我的RelayCommand類。我嘗試了其他的實施方式,但結果是一樣的。我認爲它可以工作,因爲如果我沒有將CanExecute方法傳遞給構造函數,「save」按鈕將被啓用。
public class RelayCommand : ICommand
{
private readonly Action execute;
private readonly Func<bool> canExecute;
public RelayCommand(Action execute, Func<bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute == null || canExecute();
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter) { execute(); }
}
「保存」 按鈕:
<Button Content="Save" Command="{Binding InsertCommand}"/>
的InsertCommand:
public RelayCommand InsertCommand { get; internal set; }
在視圖模型構造:
InsertCommand = new RelayCommand(ExecuteInsert, CanExecuteInsert);
CanExecute:
bool CanExecuteInsert()
{
return !string.IsNullOrEmpty(Error);
}
顯示InsertCommand它是如何初始化的以及它的CanExecute –
@lll在最後添加它。 –