2012-01-24 8 views
3

私のWPFプロジェクトにはCaliburn microを使用しています。静的メニューはカリバーンと結合しやすいCaliburnマイクロでのダイナミックメニュー

<Menu Grid.Row="0" IsMainMenu="True"> 
    <MenuItem Header="_File"> 
     <MenuItem x:Name="OpenScript" Header="_Open script"/> 
    </MenuItem> 
    <MenuItem Header="_Script"> 
     <MenuItem x:Name="RunScript" Header="_Run script" /> 
     <MenuItem x:Name="StopScript" Header="_Stop script" /> 
    </MenuItem> 
    <MenuItem Header="S_ettings"> 
     <MenuItem x:Name="Plugins" Header="_Plugins">...Clickable children here</MenuItem> 
    </MenuItem> 
</Menu> 

名がモデルのメソッドにバインドされていますが、...私たちはPluginViewModelのコレクションに対してバインドする必要があります上記を参照プラグインメニューのために、あなたがクリックしたときにされていますプラグイン私はCaliburnのアクションメソッドをメニュービューモデル(あなたは今からあなたがreuturn IResultsを得ることができる種類)でトリガーしたいと思っています。これは可能ですか? 、私は結合部分を解決したことに言及するのを忘れ

public BindableCollection<PluginMenuViewModel> Plugins { get; set; } 

しかし、私はからのクリックに耳を傾ける方法がわからない:

この質問は、このオープンソースプロジェクト https://github.com/AndersMalmgren/FreePIE

編集のためでありますモデル

答えて

7

最高方法は、あなたがこの

cal:Message.Attach="ShowSettings($originalsourcecontext)" 
ようにXAMLからそれを使用することができます

MessageBinder.SpecialValues.Add("$originalsourcecontext", context => { 
    var args = context.EventArgs as RoutedEventArgs; 
    if(args == null) { 
     return null; 
    } 

    var fe = args.OriginalSource as FrameworkElement; 
    if(fe == null) { 
     return null; 
    } 

    return fe.DataContext; 
}); 

バインダー独自のメッセージを追加することです

+0

申し訳ありませんが、 'cal:Message.Attach =" ShowSettings($ originalsourcecontext) "'を追加しますか?それは ''にありますか?しかし、そうであれば、 "プラグイン"メニューがクリック可能になり、私はその子をクリック可能にしたいだけです。 – JobaDiniz

+2

こちらをご覧くださいhttps://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Views/Main/MainMenuView.xaml#L62 – Anders

0

(私の悪い英語のため申し訳ありません)

あなたのVMのuのespecificメソッドを呼び出すことができます(あなたのXAMLの)構文を歌う:

cal:Message.Attach="[Event SelectionChanged] = [Action ItemClick($this)]" 

このパラメータとして有界アイテム自体を渡すVM上ItemClickメソッドを呼び出します。これは(通常あるように)メソッドを実行すると、「PluginItem」である場合 は、そのメソッドの内部で、あなたはそれを呼び出す必要があります:

public void ItemClick(PluginItem item) 
    { 
     item.Execute(); 
    } 

あなたがここにアクションの詳細を読むことができます:http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation

+0

MenuItemにはこのイベントはありません。私は似たようなことをしましたが、コンテキストが間違っています。コードスレッドに行くスレッドがあります。http://caliburnmicro.codeplex.com/discussions/287228 – Anders

関連する問題