1

私はMVVMを初めて使用し、リスト内のアイテムのいずれかが選択された場合に有効になり、選択されたlistitemをお気に入りリストに追加する簡単なコマンドボタンを作成したいと考えています。ここに私の AddCommand 実装があります:

class AddFavCommand : ICommand
{
    private readonly Action _favAction;
    private readonly bool _canExecute;

    public AddFavCommand()
    {
    }

    public AddFavCommand(Action favAction, bool canExecute)
    {
        _favAction = favAction;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _favAction();
    }
}

ビュー モデルでは、ビューとのバインディングを行うために、パブリック プロパティ AddFavCommand があります。

    private AddFavCommand _addFavCommand;
    private bool _canAddFavExecute;

    public ICommand AddFavCommand
    {
        get
        {
            if (_addFavCommand == null)
            {
                _addFavCommand = new AddFavCommand(AddFav, _canAddFavExecute);
            }
            return _addFavCommand;
        }
    }

そして今のところ、コマンドが機能するかどうかを確認するための簡単な機能があります:

    private void AddFav()
    {
        MessageBox.Show("Add");
    }

したがって、この部分は canExecute プロパティを実装しなくても完全に機能します。しかし、リスト内のリスト項目が選択されていないときにボタンを無効にしたいのです。私は財産を持っています:

CurrentItem

これはリスト アイテムにバインドされ、アイテムが選択されていない場合は null になります。私の質問は、アイテムが選択されていないときにボタンを無効にする方法です。私は追加しようとしました:

   private void AddFav()
    {
        MessageBox.Show("Add");
        _canAddFavExecute = CurrentItem != null; // to my function, but my button always stays disabled.  
    }

ありがとう

4

1 に答える 1

3

独自のデリゲート コマンドを作成した場合は、以下のようなデリゲートを提供する必要があります。これをコマンドのイベントにCanExecute登録できます。CanExecuteChanged

_addFavCommand = new AddFavCommand(AddFav, CanExecuteCommand);

public bool CanExecuteCommand(object parameter)
{
    return CurrentCommand != null;
}

のセッターから、コマンドのイベントをCurrentCommand発生させる必要があります。canexecutechangedあなたの場合、ブール値をコマンドに一度提供したため、常に無効になっています。

于 2013-09-17T17:25:04.300 に答える