2012-01-24 3 views
3

내 WPF 프로젝트에 Caliburn 마이크로를 사용합니다. 정적 메뉴는 Caliburn와 결합하기 쉬운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에는 해당 이벤트가 없습니다 .. 비슷한 일을했지만 문맥이 잘못되었습니다. codeplex에 스레드가 있습니다. http://caliburnmicro.codeplex.com/discussions/287228 – Anders