ボタンにバインドするコマンドを作成しようとしています.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何が起こる
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);
}
}
がある
<Button Command="{Binding RefreshCommand}" />
子のviewmodelは、CanRefreshが呼び出されることはありません。コマンドはうまく動作しますが、それは1つのAddItems(それはそれぞれの子ビューモデルで異なる方法で実装された仮想メソッドです)または他のものですが、CanExecuteは決して上がらないようです。私はMVVM Lightツールキットを使用しています。 ありがとう!
「CanRefreshが呼び出されることはありません」と言うときは、CanRefreshプロパティまたはその中のラムダを意味しますか?それは決して呼び出されないことをどのように伝えることができますか? –