我有一个GridView,如下:
<ListView ItemsSource="{Binding Path=Foo, Mode=OneWay}">
<ListView.View>
<GridView>
<GridViewColumn Header="Full name"
DisplayMemberBinding="{Binding Path=FullName}" />
我希望按下 Ctrl + C 时,所有项目(或所选项目)都会复制到剪贴板。目前不是。我正在使用 WPF 3.0 。
WPF listbox copy to clipboard部分回答,但我需要的东西看起来更简单,我猜也有一个更简单的解决方案。
PS:此GridView不支持内置列排序等。如果你知道一个更好的控制,免费和支持复制随意建议它作为一个解决方案。
答案 0 :(得分:3)
我花了一些时间来回答这个问题,所以我这样做是为了节省别人的时间:
将数据复制到剪贴板的功能,它还解决了在结果字符串中以正确的顺序获取行的问题:
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)
{ }
}
来自:
public MainWindow()
{
InitializeComponent();
add_copy_handle();
}
显然这是从上面的链接中复制了很多,只是简化了但我希望它有用。