Получите ListBox SelectedItem через ContextMenu с Multibinding в Windows.Resource - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь использовать мультисвязывание в контекстном меню, хранящемся в Window.Resources, и я не могу понять, как получить SelectedItem ListBox, к которому я присоединяю меню.

Я думаю, что мне нужно использовать PlacementTarget, но я не могу заставить что-либо работать. Я пытался использовать FindAncestor, но это не сработало. Я также попытался получить список по ElementName безрезультатно.

<Window ...>
    <Window.DataContext>
        <local:IPViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <sys:Int32 x:Key="Number">0</sys:Int32>
        <sys:Int32 x:Key="NumberLetter">1</sys:Int32>
        <sys:Int32 x:Key="NumberLetterNumber">2</sys:Int32>

        <local:CombineParams x:Key="CombineParams"/>

        <ContextMenu x:Key="DetailMenu">            
            <MenuItem Header = "Number">
                <i:Interaction.Triggers>                    
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding SwitchLabelMode}">
                            <i:InvokeCommandAction.CommandParameter>                                
                                <MultiBinding Converter="{StaticResource CombineParams}">
                                    <!-- The next line is where I'm not sure what to write to get to the listbox -->
                                    <Binding Source="{RelativeSource AncestorType={x:Type ListBox}}"/>                                  
                                    <Binding Source="{StaticResource Number}"/>
                                </MultiBinding>
                            </i:InvokeCommandAction.CommandParameter>
                        </i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </MenuItem>
            ...
    </Window.Resources>

    ...
            <ListBox Name="IndexDetailsListBox"
                    ...
                     ContextMenu="{StaticResource DetailMenu}"
                     ...>

            </ListBox>
...    
</Window>

Я не могу заставить его вернуть что-либо кроме неустановленного значения. Я благодарен за любую помощь. Ни у одного из других вопросов, которые я обнаружил, нет контекстного меню в Window.Resources с MultiBinding, которое, похоже, является моей проблемой.

1 Ответ

2 голосов
/ 27 марта 2019

Ваша проблема в том, что вы присваиваете RelativeSource - объект для свойства Source объекта Binding.RelativeSource - объект принадлежит RelativeSource -объекту.
Таким образом, вы получаете List для многозначного преобразователя:

<MultiBinding Converter="{StaticResource CombineParams}">
    <Binding Path="PlacementTarget" RelativeSource="{RelativeSource AncestorType={x:Type ContextMenu}}"/>
    <Binding Source="{StaticResource Number}"/>
</MultiBinding>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...