Динамическое меню с Caliburn micro - PullRequest
3 голосов
/ 24 января 2012

Я использую Caliburn micro для моего проекта WPF.Статические меню легко связать с 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 вызывал на модели представления меню (теперь у вас есть вид, из которого вы можете вернуть результаты IR). Это возможно?

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

edit: забыл упомянуть, что я решил обязательную часть,

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

Но я не знаю, как прослушать щелчок модели

Ответы [ 2 ]

8 голосов
/ 31 января 2012

Лучший способ - добавить собственную папку сообщений

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 голосов
/ 25 января 2012

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

Вы можете вызвать специальный метод на вашей виртуальной машине, используя синтаксис (на вашем XAML):

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

Это вызовет ItemClickметод на виртуальной машине, передающий сам ограниченный элемент в качестве параметра.Если это «PluginItem» с методом execute (как обычно это бывает), то внутри этого метода вам просто нужно вызвать его:

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

Подробнее о действиях можно прочитать здесь: http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation

...