Доступ к элементу источника ItemsSource - PullRequest
0 голосов
/ 28 июня 2010

Я создаю элемент управления списком ошибок, похожий на Visual Studio.Каждая ошибка представлена ​​классом с тремя значениями: тип (enum: Error / Warning / Message), текст (строка) и время (DateTime).Класс также имеет еще два метода получения только для чтения: TimeString (возвращает время в формате ЧЧ: ММ) и Icon (возвращает путь к значку на основе типа).

У меня есть ItemsControl, связанный с ObservableCollection объектов через свойство ItemsSource.

Теперь я хочу реализовать контекстное меню для каждого элемента с двумя действиями: Копировать в буфер обмена и Удалить из списка.

Как получить доступ к исходному элементу из коллекциииз контекстного меню обработчик клика?

Вот мой код 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>

Спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 28 июня 2010

@ ответ Слагстера сработает. Более подходящий способ сделать это в WPF - использовать команду для каждого пункта меню и установить параметр {Binding} WPF поставляется с командами для копирования и, возможно, удаления, так что вы можете использовать их снова.

1 голос
/ 28 июня 2010

Свойство DataContext любого из производных элементов FrameworkElement (т.е. TextBlock или Image или MenuItem) в DataTemplate должно иметь исходный элемент данных (дочерний объект автоматически наследует источник данных своего родителя, если не установлено иное).

В качестве обработчика события click вы получаете элемент, являющийся источником события, поэтому приведите его к MenuItem и проверьте его свойство DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...