【问题标题】:Accessing ItemsSource source item访问 ItemsSource 源项目
【发布时间】:2010-06-28 13:03:06
【问题描述】:

我正在创建一个类似于 Visual Studio 中的错误列表控件。每个错误由具有三个值的类表示:类型(枚举:错误/警告/消息)、文本(字符串)和时间(日期时间)。该类还有两个只读 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>

感谢您的帮助

【问题讨论】:

  • 顺便说一句,我不会将图标路径放在绑定的对象上。改为在枚举值属性上使用 DataTrigger 或自定义 IValueConverter!

标签: c# .net wpf xaml


【解决方案1】:

DataTemplate 中任何 FrameworkElement 派生元素(即 TextBlock 或 Image 或 MenuItem)的 DataContext 属性应具有原始数据项(子项自动继承其父项的数据源,除非另有设置)。

作为单击事件处理程序的一部分,您将获取作为事件源的元素,因此将其转换为 MenuItem 并检查其 DataContext 属性。

【讨论】:

    【解决方案2】:

    @slugster 的回答会奏效。执行此操作的更 WPF 风格的方法是对每个菜单项使用命令并将参数设置为 {Binding}。 WPF 带有用于复制和删除的命令,因此您可以重复使用这些命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多