WPF:

2010-12-03 12 views
2

後ろのコードのうち、コマンドハンドラを取って通報し、私はいくつかのコマンドは、私のXAMLで定義された結合している:WPF:

<UserControl.CommandBindings> 
    <CommandBinding 
     Command="commands:Commands.GrantAccessCommand" 
     Executed="HelpExecuted" /> 
</UserControl.CommandBindings> 

のでGrantAccessCommandは、コマンドと呼ばれる別々のクラスに位置し、HelpExecutedは後ろの私のコードです。それはうまく動作します。今度HelpExecutedを他のクラスに置くと、 "... HelpExecuted"は有効なイベントハンドラメソッド名ではありません。生成されたクラスまたはコードビハインドクラスのインスタンスメソッドだけが有効です。 "コード:

Executed="commands:Commands.HelpExecuted" 
//I also tryed: Executed="x:Static commands:Commands.HelpExecuted" 

私はCommandBindings.Add(新しいいるCommandBinding(GrantAccessCommand、HelpExecuted))を使用して後ろのコードでこれを行うことができます知っています。しかし、私はXAMLを使用してこれを行うには

方法はありますか?

+0

.NET 3.5または.NET 4を使用していますか? –

答えて

0

はこれでそれを手に入れた:

はあなたのコマンドを定義します。

public class GrantAccessCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 
    InstalViewModel _viewModel; 

    public GrantAccessCommand(InstalViewModel instalViewModel) 
    { 
     _viewModel = instalViewModel; 
    } 

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

    public void Execute(object parameter) 
    { 
     _viewModel.OnGrantAccessExecute(); 
    } 
} 

あなたのビューモデルにコマンドを公開ビューモデルのコンストラクタで

public ViewModel() 
    { 
     _grantAccessCommand = new GrantAccessCommand(this); 
    } 

をコマンドを作成します。

public ICommand GrantAccessCommand 
    { 
     get { return _grantAccessCommand; } 
    } 

XAMlでバインドする

<MenuItem x:Name="menuItemGrantAccess" Header="Grant Access" 
    Command="{Binding GrantAccessCommand}" 
    IsEnabled="> 
</MenuItem> 
1

私の推測は.Net 3.5です。 http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspxから:現在のWPFバージョンのXAMLでは、このようにイベントハンドラをバインドすることはできません。イベントハンドラは、MainWindowクラスのコードビハインドファイルで定義する必要があります。私はこれがバグか間違って残っている機能なのか、この機能を使うべきでないのか分からないが、すべてのコマンドのExecutedとCanExecuteイベントを処理するための集中化された場所を定義することを止める。

回避策は、コード内のバインディングを定義することである。

window.CommandBindings.Add(新しいいるCommandBinding(ヘルプ、HelpExecuted、HelpCanExecute))。