Я пытаюсь создать команду, которая привязывается к кнопке, и зависит от иерархии режимов просмотра для представления точки и сводных элементов в приложении wp7. Это идет что-то вроде этого (я опущу столько шаблонный код, как это возможно):RelayCommand не запускает CanExecute
Родитель ViewModel:
public RelayCommand RefreshCommand
{
get
{
return _refreshCommand;
}
set
{
if (_refreshCommand == value)
{
return;
}
var oldValue = _refreshCommand;
_refreshCommand = value;
// Update bindings, no broadcast
RaisePropertyChanged(RefreshCommandPropertyName);
}
}
public RelayCommand<RoutedEventArgs> LoadedCommand
{
get
{
Action<RoutedEventArgs> getCurrentViewmodel = (args) =>
{
CurrentViewModel = SearchByLocationViewModel; // maybe something better...
RefreshCommand = CurrentViewModel.RefreshResultsCommand;
RefreshCommand.RaiseCanExecuteChanged();
};
return new RelayCommand<RoutedEventArgs>(getCurrentViewmodel);
}
}
public RelayCommand<SelectionChangedEventArgs> PivotItemChangedCommand
{
get
{
Action<SelectionChangedEventArgs> pivotChanged = (args) =>
{
if (args != null)
{
// update current viewmodel
CurrentViewModel = ((Microsoft.Phone.Controls.PivotItem) args.AddedItems[0]).DataContext as ISearchViewModelBase;
RefreshCommand = CurrentViewModel.RefreshResultsCommand;
}
};
return new RelayCommand<SelectionChangedEventArgs>(pivotChanged);
}
}
Итак, я устанавливаю свойство RefreshCommand вида модели родительской по команде ребенка каждый раз, когда он загружается, и я делаю то же самое при изменении выбранного значения.
Xaml
<Button Command="{Binding RefreshCommand}" />
Детский ViewModel
public Func<bool> CanRefresh
{
get { return() => !IsLoading; }
}
private RelayCommand refreshResultsCommand;
public RelayCommand RefreshResultsCommand
{
get
{
Action doRefresh =() =>
{
SearchResults.Clear();
this._pageNumber = 0;
AddItems();
};
return refreshResultsCommand = refreshResultsCommand ?? new RelayCommand(doRefresh, CanRefresh);
}
}
Что происходит, то CanRefresh никогда не вызывается. Команды работают нормально, в зависимости от того, какой пивотитем он вызывает один AddItems (это виртуальный метод, реализованный по-разному в каждой модели просмотра для детей) или другой, но это похоже на то, что CanExecute никогда не поднимается. Я использую инструментарий MVVM Light. Спасибо!
Когда вы говорите «CanRefresh НИКОГДА не звонит», вы имеете в виду свойство CanRefresh или лямбда внутри него? Как вы можете сказать, что его никогда не называют? –