私は単純なwpfアプリケーションを持っており、フォームにエラーがある場合は保存ボタンを無効にしようとしています。wpf mvvmエラーの確認
問題は、それが完璧に動作するように見えますが、理由はわかりませんが、エラーをチェックする方法からすべての時間が間違っています。
私はコードを提供することでより明確にしてください。
これはこれは、ボタンのコマンド
public ICommand SaveItem {
get { return new RelayCommand(SaveItemExecute,CanSaveItem); }
}
private bool CanSaveItem() {
return IsValid;
}
//I set up here a breakpoint and it returns the correct value just once.
//The application looked up on CanSaveItem all the time and except the first time, it returns wrong value
private bool _isValid;
public bool IsValid {
get { return _isValid; }
set {
_isValid = value;
RaisePropertyChanged("IsValid");
}
}
検証ルール
[Required(ErrorMessage = "Please enter Title")]
[StringLength(100, ErrorMessage = "The maximum length is 100")]
string Name { get; set; }
IドンであるMainWindow.Xaml.cs
private readonly HashSet<ValidationError> errors = new HashSet<ValidationError>();
private Lazy<MainWindowViewModel> viewModel;
public MainWindow() {
InitializeComponent();
InitializeValidaton();
}
void InitializeValidaton() {
viewModel = new Lazy<MainWindowViewModel>();
Validation.AddErrorHandler(this, ErrorChangedHandler);
}
private void ErrorChangedHandler(object sender, ValidationErrorEventArgs e) {
if (e.Action == ValidationErrorEventAction.Added) {
errors.Add(e.Error);
} else {
errors.Remove(e.Error);
}
//I set a breakpoint here and it returns the correct value. False if it has errors and True if not
viewModel.Value.IsValid = !errors.Any();
}
からのコードですそれがmaかどうか知りませんどのような感覚もありますが、非アクティブ化したいボタンはUserControlにあります。
私はなぜuserControlにあるcanExecuteメソッドが複数回トリガされたのか理解できません。私が使った場合、これまでどんな方法があっても、それは同じ反応をします。 mainWindowの同じメソッド(ICommandの一部)をmainWindowで使用すると、一度だけトリガーされるので、私はuserControlについて言及します。
私は誰にも助けてくれますか?
ありがとうございました
おそらくそのための2レベル参照Value.IsValid機能しません。 "RaisePropertyChanged(" SaveItem ")"のような手動でコマンドを更新してみてください。 – vorrtex
@vorrtex何か提案できますか? – StrouMfios