2015-01-31 6 views
0

Для начала, у меня есть эта ситуация:Caliburn Micro и Контекстное приводит к цели не найдено

 <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> 

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

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

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

ответ

2

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

Что вы можете сделать, это использовать это: BindingProxy (thanks to Daniel)

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

кал: Action.Target = "{Binding Source = {StaticResource BindingProxy}, Path = Data} "

0

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

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

+0

ElementName не работал для меня, я пробовал каждую комбинацию. Однако BindingProxy работает как шарм. –

 Смежные вопросы

  • Нет связанных вопросов^_^