Результаты Caliburn Micro и ContextMenu, цель не найдена

Для начала у меня есть такая ситуация:

        <components:ImageButton ImageSource="../Resources/Images/test.png" Height="32" Width="32" Style="{StaticResource MenuButtonWithContextMenuStyle}">
            <components:ImageButton.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Test" cal:Message.Attach="Test"/>
                </ContextMenu>
            </components:ImageButton.ContextMenu>
        </components:ImageButton>

Наряду с этим стилем:

        <Style TargetType="{x:Type components:ImageButton}" x:Key="MenuButtonWithContextMenuStyle">
            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type components:ImageButton}">
                        <Grid x:Name="ContentGrid" Background="{TemplateBinding Background}" ToolTip="{TemplateBinding ToolTip}" ContextMenu="{TemplateBinding ContextMenu}">
                            <Image Source="{TemplateBinding ImageSource}" Height="12" Width="12" HorizontalAlignment="Center" IsEnabled="{TemplateBinding IsEnabled}" ToolTip="{TemplateBinding ToolTip}" Stretch="Uniform" VerticalAlignment="Center" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" />
                                    <Condition Property="IsEnabled" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#22000000" TargetName="ContentGrid"/>
                            </MultiTrigger>

                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsPressed" Value="True" />
                                    <Condition Property="IsEnabled" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#33000000" TargetName="ContentGrid"/>
                            </MultiTrigger>

                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding ElementName=ContentGrid, Path=ContextMenu.IsOpen}" Value="True"/>
                                    <Condition Binding="{Binding ElementName=ContentGrid, Path=IsEnabled}" Value="True"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="#22000000" TargetName="ContentGrid"/>
                            </MultiDataTrigger>

                            <EventTrigger RoutedEvent="Click">                                    
                                <EventTrigger.Actions>
                                    <BeginStoryboard>                                            
                                        <Storyboard>
                                            <BooleanAnimationUsingKeyFrames Storyboard.Target="{Binding ElementName=ContentGrid}" Storyboard.TargetProperty="ContextMenu.IsOpen" >
                                                <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                            </BooleanAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>

                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Opacity" Value="0.3"/>
                </Trigger>
            </Style.Triggers>
        </Style>

Все довольно просто, но я не могу заставить Калибурна найти цель моего метода "Тест". Я могу заставить его работать, если я добавлю контекстное меню в style () вместо использования привязки шаблона, но это кнопка, которую я планирую использовать довольно много раз, и я бы ненавидел это, если бы мне пришлось скопировать это поверх многократно.

Я уже попробовал несколько предложенных исправлений здесь и на сайте калибровки (например, метод TargetWithoutContext), но он никогда не работает. Я понятия не имею, как я смогу это исправить.

ImageButton - это обычная кнопка с добавленным свойством зависимости ImageSource.

2 ответа

Решение

Хорошо, я собираюсь опубликовать ответ на свой вопрос.

Что вы можете сделать, это использовать это: BindingProxy (спасибо Дэниелу)

Затем используйте как таковой:

cal: Action.Target = "{Binding Source = {StaticResource BindingProxy}, Path = Data}"

Та же проблема существует в Windows Phone 7 с решением здесь.

По сути, вы хотите установить cm:Action.TargetWithoutContext используя либо BindingProxy как предложил другой ответ или используйте ElementName связывание.

Другие вопросы по тегам