我正在创建一个类似于Visual Studio中的错误列表控件。每个错误由具有三个值的类表示:type(枚举:错误/警告/消息),文本(字符串)和时间(DateTime)。该类还有两个只读的getter:TimeString(返回时间为HH:MM)和Icon(根据类型返回图标路径)。
我有一个ItemsControl通过ItemsSource属性绑定到ObservableCollection对象。
我现在想要为每个项目实现一个上下文菜单,其中包含两个操作:复制到剪贴板和从列表中删除。
如何从上下文菜单项单击处理程序中访问集合中的原始项?
这是我的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 :(得分:1)
DataTemplate中任何FrameworkElement派生元素(即TextBlock或Image或MenuItem)的DataContext
属性应该具有原始数据项(除非另有设置,否则子项会自动继承其父项的数据源)。
作为click事件处理程序的一部分,您将获得作为事件源的元素,因此将其强制转换为MenuItem并检查其DataContext属性。
答案 1 :(得分:1)
@ slugster的答案会起作用。更多WPF式的方法是对每个菜单项使用命令并将参数设置为{Binding}
。 WPF带有复制和可能删除的命令,因此您可以重用这些命令。