WPF - Как скопировать нужный элемент в ListView?

216
08 февраля 2020, 21:30

Xaml

<Window x:Class="PortScanner.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Scanner Port" WindowStartupLocation="CenterScreen">
    <ListView Name="listview_scaner" Margin="10">
        <ListView.Resources>
            <Style TargetType="{x:Type ListView}">
                <Setter Property="ItemContainerStyle">
                    <Setter.Value>
                        <Style TargetType="ListViewItem">
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                        </Style>
                    </Setter.Value>
                </Setter>
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="Скопировать в буфер обмена"></MenuItem>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>
                <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Port ID" DisplayMemberBinding="{Binding Path=PortNumber}"
                                    Width="150"/>
                    <GridViewColumn Header="Local Adress" DisplayMemberBinding="{Binding Path=Local}"
                                    Width="250"/>
                    <GridViewColumn Header="Remote Adress" DisplayMemberBinding="{Binding Path=Remote}" Width="250"/>
                    <GridViewColumn Header="State" DisplayMemberBinding="{Binding Path=State}" Width="250"/>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
</Window>

Создал контекстное меню, но не могу понять как сделать чтобы при нажатию на кнопку копировался в буфер обмена нужный текст из нужной колонки

Code:

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Windows;
using System.Windows.Controls;
namespace PortScanner
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
           // this.CenterWindowOnScreen();
            this.listview_scaner.ItemsSource = GetOpenPort();
        }
        private static List<PortInfo> GetOpenPort()
        {
            var properties = IPGlobalProperties.GetIPGlobalProperties();
            IPEndPoint[] tcpEndPoints = properties.GetActiveTcpListeners();
            return properties.GetActiveTcpConnections().Select(p =>
            {
                return new PortInfo(p.LocalEndPoint.Port, $"{p.LocalEndPoint.Address}:{p.LocalEndPoint.Port}", $"{p.RemoteEndPoint.Address}:{p.RemoteEndPoint.Port}", p.State.ToString());
            }).ToList();
        }
        private void CenterWindowOnScreen()
        {
            double screenWidth = SystemParameters.PrimaryScreenWidth;
            double screenHeight = SystemParameters.PrimaryScreenHeight;
            double windowWidth = this.Width;
            double windowHeight = this.Height;
            this.Left = (screenWidth / 2) - (windowWidth / 2);
            this.Top = (screenHeight / 2) - (windowHeight / 2);
        }
        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                foreach (ListViewItem item in e.AddedItems.OfType<ListViewItem>())
                {
                    Clipboard.SetText(item?.ToString());
                }
            }
            catch { }
        }
    }
}
Answer 1

Используйте свойство ListView.SelectedItem, которое в вашем случае будет хранить экземпляр выбранного PortInfo:

XAML:

<ListView.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Скопировать в буфер обмена" Click="MenuItem_Click"/>
    </ContextMenu>
</ListView.ContextMenu>

Code-behind:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    if (listview_scaner.SelectedItem != null)
    {
        Clipboard.SetText(listview_scaner.SelectedItem.ToString());
    }
}
READ ALSO
ObservableCollection связать с listView

ObservableCollection связать с listView

Сначала попробовал сделать так как в инструкции https://docsmicrosoft

204
С# Вопрос по Chart.Series!

С# Вопрос по Chart.Series!

Возможно ли написать код к примеру: Если ChartSeries[0] существует, то ввести Chart

213
Перенос строк в заголовке datagrid WPF

Перенос строк в заголовке datagrid WPF

Подскажите как оформить перенос строк в шапке datagrid (WPF) и отцентрировать содержимое заголовка по центру?

260