Мне потребовалось некоторое время, чтобы ответить на этот вопрос, поэтому вот как я это сделал, чтобы сэкономить чужое время:
Функция для копирования данных в буфер обмена, она также решает проблему получения строк вправильный порядок в результирующей строке:
void copy_selected()
{
if (listview.SelectedItems.Count != 0)
{
//where MyType is a custom datatype and the listview is bound to a
//List<MyType> called original_list_bound_to_the_listview
List<MyType> selected = new List<MyType>();
var sb = new StringBuilder();
foreach(MyType s in listview.SelectedItems)
selected.Add(s);
foreach(MyType s in original_list_bound_to_the_listview)
if (selected.Contains(s))
sb.AppendLine(s.ToString());//or whatever format you want
try
{
System.Windows.Clipboard.SetData(DataFormats.Text, sb.ToString());
}
catch (COMException)
{
MessageBox.Show("Sorry, unable to copy surveys to the clipboard. Try again.");
}
}
}
У меня все еще иногда возникают проблемы с COMException, когда я копирую материал в буфер обмена, следовательно, try-catch.Я, кажется, решил эту проблему (очень плохо и лениво) путем очистки буфера обмена, см. Ниже.
И связать это с Ctrl + C
void add_copy_handle()
{
ExecutedRoutedEventHandler handler = (sender_, arg_) => { copy_selected(); };
var command = new RoutedCommand("Copy", typeof(GridView));
command.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Control, "Copy"));
listview.CommandBindings.Add(new CommandBinding(command, handler));
try
{ System.Windows.Clipboard.SetData(DataFormats.Text, ""); }
catch (COMException)
{ }
}
, которыйcall from:
public MainWindow()
{
InitializeComponent();
add_copy_handle();
}
Очевидно, что это много скопировано по ссылке выше, просто упрощено, но я надеюсь, что это полезно.