2015-09-09 80 views
1

我已經用對象填充了一個ListView,並且已經將一個ContextMenu綁定到了我的ListView中的這些項目。 ContextMenu只能通過點擊一個項目來打開。問題是Caliburn Micro拋出一個錯誤,它無法找到ShowProperties()的目標方法。Caliburn Micro在ListView中找不到ContextMenu中的DataContext

我認爲會發生此問題,因爲Caliburn沒有可用的ViewModel的正確DataContext。我試過#2許多解決方案,使視圖模型提供給文本菜單項,但無濟於事例如:

WPF: Binding a ContextMenu to an MVVM Command

「No target found for method」 thrown by Caliburn Message.Attach()

WPF Context Menus in Caliburn Micro

這是我的看法的XAML代碼:

<Window x:Class="CueMaster.Views.AppView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:dragDrop="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop" 
     xmlns:cal="http://www.caliburnproject.org" 
     Height="500" Width="800"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="200" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <ListView Grid.Column="1" Margin="5" 
     ItemsSource="{Binding Cues}" 
     dragDrop:DragDrop.IsDragSource="True" 
     dragDrop:DragDrop.IsDropTarget="True" 
     dragDrop:DragDrop.DropHandler="{Binding}"> 

     <ListView.Resources> 
      <ContextMenu x:Key="ItemContextMenu"> 
       <MenuItem Header="Properties" cal:Message.Attach="ShowProperties($dataContext)" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"> 
        <MenuItem.Icon> 
         <Image Source="../PropertyIcon.png" /> 
        </MenuItem.Icon> 
       </MenuItem> 
      </ContextMenu> 
     </ListView.Resources> 

     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}" > 
       <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" /> 
      </Style> 
     </ListView.ItemContainerStyle> 

     <ListView.View> 
      <GridView > 
       <GridViewColumn Width="70" Header="Cue" DisplayMemberBinding="{Binding Id}" /> 
       <GridViewColumn Width="100" Header="Name" DisplayMemberBinding="{Binding Name}" /> 
       <GridViewColumn Width="100" Header="Description" DisplayMemberBinding="{Binding Description}" /> 
       <GridViewColumn Width="70" Header="Duration" DisplayMemberBinding="{Binding Duration}" /> 
       <GridViewColumn Width="70" Header="Elapsed" DisplayMemberBinding="{Binding Elapsed}" /> 
       <GridViewColumn Width="70" Header="Remaining" DisplayMemberBinding="{Binding Remaining}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

我錯過了什麼?

回答

4

您可以通過放置命令綁定來重寫CM的功能。由於可視化樹不知道上下文菜單是否存在,更let論數據環境是背後的目的。

<ListView.ItemContainerStyle> 
<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
      <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
       <MenuItem Header="Properties" cal:Message.Attach="ShowProperties($dataContext)" > 
       <MenuItem.Icon> 
        <Image Source="../PropertyIcon.png" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      </ContextMenu> 
     </Setter.Value> 
    </Setter> 
</Style> 
</ListView.ItemContainerStyle> 

雖然我明白你想用ListView中的資源來做什麼,你正在用腳本命令綁定自己。放棄資源給ItemContainerStyle一個滾動,看看它是否工作。您可以隨後將其分解爲資源。爲了測試目的,看看它是否有效,現在嘗試內部風格。

+0

謝謝,但遺憾的是它仍然沒有找到ShowProperties方法,有或沒有$ DataContext的..我得到的消息PlacementTarget的該標籤不能在數據上下文類型System.Windows來解決。 UIElement,可能導致這種情況的任何事情? –

+0

您的項目結構如何?分離組件?容器類型(如果有)? – mvermef

+0

我使用NuGet引用了Caliburn.Micro和Caliburn.Micro.Platform包。我正在使用正常的Caliburn結構;視圖和ViewModels目錄。完整的視圖XML就像我發佈的那樣。我不確定容器類型是什麼意思。 –

0

使用mvermef的答案,我得到它的工作。唯一需要在其代碼中進行更改的是綁定意味着「沿着可視化樹行程,找到此第一個ContextMenu對象並綁定到PlacementTarget.Tag屬性」。問題在於綁定在ContextMenu本身上,所以沒有父ContextMenu對象。使用RelativeSource Self修復了這個問題。

<ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/> 
       <Setter Property="ContextMenu"> 
        <Setter.Value> 
         <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
          <MenuItem Header="Properties" cal:Message.Attach="ShowProperties($dataContext)" > 
           <MenuItem.Icon> 
            <Image Source="../PropertyIcon.png" /> 
           </MenuItem.Icon> 
          </MenuItem> 
         </ContextMenu> 
        </Setter.Value> 
       </Setter> 
      </Style> 
</ListView.ItemContainerStyle>