Как щелчок элемента подменю Caliburn.Micro может вызвать действие в модели представления, содержащей представление?

У меня есть меню верхнего уровня в моем ShellView, и при выборе подэлемента MenuItem я хотел бы вызвать следующий метод в ShellViewModel (Conductor.Collection.AllActive).

    public void SelectServer(string pServerName)
    {
        mDefaultClaimServer = pServerName;
    }

Следующее не работает, так как метод не вызывается (я пробовал различные сигнатуры и параметры действия) -

    <Menu Name="menu1" DockPanel.Dock="Top">
        <MenuItem Header="Select Server" Name="ClaimServers">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <!-- we need this else we show the class name -->
                    <TextBlock Text="{Binding DisplayName}">
                        <ContentControl cal:Message.Attach="[Event Click] = [Action TxTester.ShellViewModel.SelectServer($Text)]"/>
                    </TextBlock>
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </Menu>

Следующее вызывает метод ShellViewModel SelectServer, но я получаю null для текста щелкнутого подпункта MenuItem (я также пробовал многие другие подписи и параметры действия) -

    <Menu Name="menu1" DockPanel.Dock="Top">
        <MenuItem Header="Select Server" Name="ClaimServers" cal:Message.Attach="SelectServer($this.Text)">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <!-- we need this else we show the class name -->
                    <TextBlock Text="{Binding DisplayName}" />
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </Menu>

Я уже давно с этим борюсь и не могу понять. Может ли кто-нибудь предложить правильную комбинацию, в которой я могу передать текст заголовка подпункта MenuItem методу ShellViewModel SelectServer?


person Dave    schedule 01.07.2012    source источник
comment
Меню не будет запускать SelectionChanged или иметь свойство SelectedItem для привязки.   -  person Derek Beattie    schedule 01.07.2012
comment
Дерек. Я пытаюсь избежать кода, связанного с событиями, используя механизмы CM (а также пытаюсь изучить CM).   -  person Dave    schedule 01.07.2012
comment
Конечно, но для этого можно использовать действие.   -  person Derek Beattie    schedule 02.07.2012
comment
Я мог нормально вызывать действия, но не мог найти параметр для передачи, который доставил бы мне текст MenuItem (я попробовал Text в качестве аргумента, и мое действие было вызвано, но аргумент был нулевым). Я попробовал все, что мог придумать. Вы знаете, кто бы это сделал? Я все еще новичок в CM, и у меня работает только то, что ниже. Наверное просто неправильно сделал...   -  person Dave    schedule 02.07.2012


Ответы (1)


Я получил то, что пытался сделать, согласно сообщению Роба Айзенберга, описывающему «особый трюк для получения текста из связанных подменю» здесь — http://caliburnmicro.codeplex.com/discussions/287228

Я все еще хотел бы знать, как сделать то, что я пытался сделать, со стандартной логикой OOTB, если у кого-то есть предложения, чтобы я мог лучше понять CM.

В основном я добавил это в загрузчик Configure() overide -

        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 -

        <MenuItem Header="_Select Server" Name="ClaimServers" cal:Message.Attach="SelectServer($originalsourcecontext)" />

а затем мне передали текст заголовка подпункта меню, чего я и хотел.

person Dave    schedule 01.07.2012