Это еще один вопрос к моей другой теме: MVVM Navigating through different Views, я выяснил, что проблема пока не решена (другая тема). Этот вопрос связан с Predicate моей команды (метод CanExecute).Предикат не будет правильно проверять параметр
public RelayCommand ChangePageCommand {
get {
return new RelayCommand(p => ChangeViewModel((BaseViewModel)p), x => x is BaseViewModel);
}
}
public RelayCommand TestChangePageCommand {
get {
return new RelayCommand(p => MessageBox.Show((p is BaseViewModel).ToString()), x => true);
}
}
Я создал какой-то метод испытания, чтобы определить, где актуальна проблема находится:
MessageBox.Show((p is BaseViewModel).ToString())
из TestChangePageCommand показывает DialogBox с «истинным», но предиката от ChangePageCommand
x => x is BaseViewModel
всегда возвращает «false» (также предикат из TestChangePageCommand делает, если он реализован)
Может кто-нибудь может понять, почему мое приложение ведет себя так?
Update 1:
Выход из окна говорит:
Не удается получить значение с помощью связывания и не действует резервное значение не существует; используя вместо этого по умолчанию. BindingExpression: Path = HomePage; DataItem = NULL; целевым элементом является «Button» (Name = ''); предназначаться свойство является «CommandParameter» (тип «Объект»)
Update 2:
Я проверил ViewModel и выяснили, что HomePage не является нулевым, когда он получить Установим как CurrentPageViewModel. Возможно ли, что метод CanExecute будет выполняться при создании ViewModel и HomePage еще не определен? Как я могу это решить?
Поместите точку останова на 'x => x is BaseViewModel' и сообщите нам, что такое' x'. Кроме того, не записывайте свойства только для чтения, как и вы, - ваш геттер снова и снова создает новые экземпляры RelayCommand. Создайте команду один раз и кешируйте значение в закрытом поле. – Dennis
вы можете протестировать запуск сообщения из canececute, выполнив x.ToString(); знать, что на самом деле происходит x, или он даже называется – Nitin
. Как-то x имеет значение null, когда выполняется метод CanExecute, но, как уже упоминалось, если я модифицирую метод CanExecute, чтобы просто вернуть true, и нажмите кнопку, он вернет «HomeViewModel» », который происходит из BaseViewModel. После изменения некоторых параметров окна вывода говорят, что свойство «HomePage» не найдено для «объекта», потому что элемент данных имеет значение NULL. Это может произойти, потому что поставщик данных еще не выдал никаких данных ». – C4p741nZ