2010-06-28 146 views
0

我創建了一個類似於Visual Studio中的錯誤列表控件。每個錯誤由具有三個值的類表示:type(枚舉:錯誤/警告/消息),文本(字符串)和時間(DateTime)。該類還有另外兩個只讀獲取器:TimeString(返回時間HH:MM)和Icon(返回基於類型的圖標路徑)。訪問項目源項目

我有綁定到經由ItemsSource屬性對象的一個​​ObservableCollection一個ItemsControl。

我現在想實現對每一個項目的上下文菜單中有兩個動作:複製到剪貼板,並從列表中刪除。

如何從收集從上下文菜單單擊處理程序訪問原來的項目嗎?

這是我的XAML代碼:

<ItemsControl Name="itemsControl" ItemsSource="{Binding Items, ElementName=ConsoleWindow}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate DataType="Console.Items"> 
       <Border Name="itemBorder" BorderBrush="LightGray" BorderThickness="0,0,0,1" SnapsToDevicePixels="True" Padding="4"> 
        <Border.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Copy to clipboard" /> 
          <MenuItem Header="Delete" /> 
         </ContextMenu> 
        </Border.ContextMenu> 
        <DockPanel> 
         <Image Width="16" Height="16" Source="{Binding Icon}" Margin="0,3,4,0" VerticalAlignment="Top" DockPanel.Dock="Left" /> 
         <TextBlock VerticalAlignment="Center" TextWrapping="Wrap" DockPanel.Dock="Left"> 
          <Run Text="{Binding Text}" /> 
          <TextBlock Foreground="Gray" FontSize="9"> 
           <Run Text=" (" /><Run Text="{Binding TimeString, Mode=OneWay}" /><Run Text=") " /> 
          </TextBlock> 
         </TextBlock> 
        </DockPanel> 

感謝您的幫助

+0

另外,我不會把圖標路徑放在你的綁定對象上。改爲使用枚舉值屬性上的DataTrigger或自定義IValueConverter! – 2010-06-28 13:22:43

回答

1

任何FrameworkElement的派生元素的DataContext屬性(即TextBlock的或圖像或菜單項)在DataTemplate中應該有原始數據項(除非另有設置,子項會自動繼承其父項的數據源)。

作爲click事件處理程序的一部分,您獲取作爲事件源的元素,因此將其轉換爲MenuItem並檢查其DataContext屬性。

+0

就是這樣,謝謝! – 2010-06-28 13:29:16

1

@ slugster的答案會工作。更多WPF式的做法是使用每個菜單項的命令並將參數設置爲{Binding}。 WPF附帶了用於複製和可能刪除的命令,因此您可能會重複使用這些命令。

+0

+1 ..這是一個很好的選擇。 – slugster 2010-06-28 13:36:22