listview - WPF ListView GridView 复制到剪贴板

标签 listview gridview mvvm copy clipboard

我有一个像下面这样的 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 不支持内置的列排序等等。如果您知道更好的免费控件并支持复制,请随时将其作为解决方案提出建议。

最佳答案

我花了一些时间来回答这个问题,所以我是这样做的以节省其他人的时间:

将数据复制到剪贴板的函数,它还解决了在结果字符串中以正确顺序获取行的问题:

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。我似乎通过清除剪贴板解决了这个问题(以一种非常糟糕和懒惰的方式),见下文。

并将其绑定(bind)到 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();
}

显然这是从上面的链接中复制了很多,只是简化了,但我希望它有用。

关于listview - WPF ListView GridView 复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6277016/

相关文章:

c# - 在 ListViewRenderer 上使用 CachingStrategy 导致属性错误

listview - 如何通过代码使ListView VCL折叠/展开?

ios - RxSwift MVVM 实现查询

mvvm - MVVM 模型应该是什么样的?

wpf - 如何添加验证以查看模型属性或如何实现 INotifyDataErrorInfo

listview - 使用 ListView 时是否必须使用 ListTile?

android - 如何使用自定义适配器从 ListView 返回自定义对象

javascript - 一个单元格中的多个值作为组合框

gridview - 将过滤器属性添加到 Yii2 yii\grid\ActionColumn 类

c# - 如何更改行 MouseOver 上的 GridView 单元格颜色