2010-06-28 149 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