3

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メソッドを呼び出しますが、クリックされたサブMenuItemのテキストに対してnullを取得します(他の多くの署名とアクションパラメーターも試しました)-

    <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 メソッドに渡すことができる適切な組み合わせを誰かが提案できますか?

4

1 に答える 1

10

ここで「バインドされたサブメニューからテキストを取得するための特別なトリック」について説明しているRob Eisenbergからの投稿に従って、私がやろうとしていたことを手に入れました - http://caliburnmicro.codeplex.com/discussions/287228

CMをよりよく理解できるように、誰かが提案を持っている場合は、標準のOOTBロジックでやろうとしていたことを行う方法を知りたいと思っています.

基本的に、これをブートストラップの Configure() オーバーライドに追加しました -

        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)" />

そして、私が欲しかったサブメニューアイテムのヘッダーテキストが渡されました。

于 2012-07-01T22:06:53.023 に答える