Я пытаюсь создать команду, которая привязывается к кнопке и зависит от иерархии моделей представления для представления сводной точки и сводных элементов в приложении wp7.Это выглядит примерно так (я опущу как можно больше стандартного кода):
Родительская модель представления:
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}" />
дочерняя модель представления
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.Спасибо!