2012-01-24 2 views
3

Я использую Caliburn micro для моего проекта WPF. Статическое меню легко связать с CaliburnДинамические меню с Caliburn micro

<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 запускался по модели представления меню (теперь вы можете получить повторные IResults). Возможно ли это?

Этот вопрос для этого с открытым исходным кодом проекта https://github.com/AndersMalmgren/FreePIE

редактирования: Забыл упомянуть, что я решил связывающую часть,

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

Но я не знаю, как слушать Клик модель

ответ

7

Лучший способ, чтобы добавить свое сообщение связующий

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; 
}); 

Вы можете использовать его из XAML, как это

cal:Message.Attach="ShowSettings($originalsourcecontext)" 
+0

Извините, но где именно я add 'cal: Message.Attach =" ShowSettings ($ originalalsourcecontext) "'? Это в плагинах ' '? Но если это так, то меню «Плагины» будет доступно для кликов, и я хочу, чтобы его дети были доступны для просмотра. – JobaDiniz

+2

Пожалуйста, посмотрите здесь https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Views/Main/MainMenuView.xaml#L62 – Anders

0

(извините за мой плохой английский)

Вы можете вызвать especific метод на вашем VM U петь синтаксис (на вашем языке XAML):

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

Это вызовет ItemClick метод на VM проходящего сам ограниченный элемент в качестве параметра. Если это «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