2011-10-17 97 views
0

我有這種風格到ResourceDictionary中。這是一個ToggleButton的列表。我爲每個按鈕添加一個contextMenu,並且我想將視圖模型交給click事件。我將Editindicator方法放入viewmodel中。當我運行該項目時,我點擊了contextmenu項目,並且顯示此錯誤「{」沒有找到方法的目標單擊。「}」。我認爲這個錯誤是由於menuitem丟失了viewmodel的數據上下文。 任何人都可以在這裏幫忙嗎?非常感謝諮詢。Doesn't手MenuItem點擊進入viewmodel

<Style x:Key="ListBoxStyleIndicador" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
    <Setter Property="Padding" Value="2,0,2,0"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate x:Name="ListBoxStyleIndicadorTemplate" TargetType="{x:Type ListBoxItem}"> 
       <Border x:Name="Bd" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         Padding="{TemplateBinding Padding}" 
         SnapsToDevicePixels="true"> 
        <Controles:ToggleButtonIndicador 
         Content="{Binding NombreIndicador}" 
         IdBIIndicadores="{Binding IdBiIndicadores}" 
         IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
         Style="{DynamicResource BotonNegro}" 
         Padding="6,2"        
         ToolTip="{Binding Descripcion}"> 
         <Controles:ToggleButtonIndicador.ContextMenu > 
          <ContextMenu> 
           <MenuItem Header="Editar"> 
            <MenuItem.Icon> 
             <Image Source="{DynamicResource ImagenBotonEditar}" />            
            </MenuItem.Icon> 
            <Interactivity:Interaction.Triggers> 
             <Interactivity:EventTrigger EventName="Click"> 
              <cal:ActionMessage MethodName="EditIndicator" /> 
             </Interactivity:EventTrigger> 
            </Interactivity:Interaction.Triggers> 
           </MenuItem>         
          </ContextMenu> 
         </Controles:ToggleButtonIndicador.ContextMenu> 
        </Controles:ToggleButtonIndicador> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="IsSelected" Value="{Binding Seleccionado, Mode=TwoWay}"/>   
</Style> 

回答

0

由於文本菜單是不是你的視覺樹的一部分,你不會得到引用您的視圖模型的DataContext的被設置爲你的用戶控件。有兩種方法可以爲您的控件獲取datacontext -

編輯:對於DataContext的,你可以做這樣的 -

<Controles:ToggleButtonIndicador Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}> 
         <Controles:ToggleButtonIndicador.ContextMenu > 
          <ContextMenu DataContext={Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}> 
           <MenuItem Header="Editar"> 
            <MenuItem.Icon> 
             <Image Source="{DynamicResource ImagenBotonEditar}" />            
            </MenuItem.Icon> 
            <Interactivity:Interaction.Triggers> 
             <Interactivity:EventTrigger EventName="Click"> 
              <cal:ActionMessage MethodName="EditIndicator" /> 
             </Interactivity:EventTrigger> 
            </Interactivity:Interaction.Triggers> 
           </MenuItem>         
          </ContextMenu> 
         </Controles:ToggleButtonIndicador.ContextMenu> 
        </Controles:ToggleButtonIndicador> 

我假設你的viemodel綁定到你的UserControl的DataContext屬性。

+0

我做到這一點,它doesn't工作:<文本菜單的DataContext = 「{結合PlacementTarget,的RelativeSource = {的RelativeSource自}}」> – user998678

+0

解決方案: [WPF]如何綁定到數據時在DataContext不被繼承 http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ – user998678

+0

是的,你可以使用這裏的代理綁定。 –

0

萬一它可以幫助任何人。在使用以下示例代碼之前,強烈建議在CodeProject上閱讀Attaching a Virtual Branch to the Logical Tree in WPF。你會知道爲什麼會出現問題,以及如何優雅地解決問題。

下面是一個簡單的例子。

// Add a DataContextBridge. 
<UserControl.Resources> 
    <FrameworkElement x:Key="DataContextBridge" /> 
</UserControl.Resources> 

// Bind. 
<UserControl.DataContext> 
    <Binding 
     Mode="OneWayToSource" 
     Path="DataContext" 
     Source="{StaticResource DataContextBridge}" /> 
</UserControl.DataContext> 

// Trigger a click event. 
<ContextMenu> 
    <MenuItem> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <ei:CallMethodAction 
        TargetObject="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}" 
        MethodName="OnClick" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </MenuItem> 
</ContextMenu> 

謝謝。