1

何が原因なのかまったくわかりません。

背景: Prism フレームワークの使用

  1. 私はにバインドされたボタンを持っていますDelegateCommand
  2. 電話するRaiseCanExecuteChanged

Visual Studio でデバッグ モードでアプリを起動すると、すべてが完全に機能します。アプリは完璧に動作します。

その後、.exe 経由でアプリを開くと、RaiseCanExecuteChangedメソッドが呼び出されていません。なぜそうなるのか、私にはわかりません。他の誰かが同様の問題に遭遇しますか?


編集: .exe を介して最初にアプリを開くと、RaiseCanExecuteChangedが呼び出されます (私のコンストラクターで設定したためViewModel)。ただし、再度呼び出されることはありません。


必要な場合のコード:

private readonly DelegateCommand _buttonCommand;

public ViewModel()
{
    _buttonCommand = new DelegateCommand(Button, CanExecuteButton);
}

public DelegateCommand ButtonCommand
{
    get { return this._buttonCommand; }
}

public void Button()
{
    ... do stuff ...
    _buttonCommand.RaiseCanExecuteChanged();
}

public bool CanExecuteButton()
{
    if (some condition)
        return true;
    else
        return false;
}

<Button x:Name="MyButton" Content="ClickMe"
        Command="{Binding ButtonCommand}">

IsEnabled私は必死になって、バインドしたボタンにプロパティを入れようとしましたCanExecuteButtonが、役に立ちませんでした。

4

2 に答える 2

0

Prism DelegateCommand.CanExeuteChanged イベントが呼び出されないという同様の問題が発生しました。ソース コードを調べると、CommandManager.RequerySuggested.

イベント CanExecuteChanged が次のような独自のコマンドを作成してみてください。

public RelayCommand : ICommand
{
    private event EventHandler _canExecuteChanged;
    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
            _canExecuteChanged += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
            _canExecuteChanged -= value;
        }
    }

    public void RaiseCanExecuteChanged()
    {
        var handler = _canExecuteChanged;
        if (handler != null)
            handler(this, EventArgs.Empty);

    }

    // All the other stuff also 
}

ここで、WPF が UI の変更を検出すると、CommandManager はコマンドで CanExecute を呼び出します。また、アプリケーションのエンジンルームで何かが変更された場合は、呼び出しRaiseCanExecuteChangedて CanExecute を更新できます。

于 2015-05-02T08:05:54.583 に答える