GridView WPF ListView скопировать в буфер обмена - PullRequest
1 голос
/ 08 июня 2011

У меня есть 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 в буфер обмена , но то, что мне нужно, кажется более простым, и я думаю, что есть и более простое решение.

PS: этот GridView не поддерживает встроенную сортировку столбцов и т. Д.Если вы знаете лучший бесплатный контроль и поддерживаете копирование, не стесняйтесь предложить его в качестве решения.

1 Ответ

3 голосов
/ 10 ноября 2011

Мне потребовалось некоторое время, чтобы ответить на этот вопрос, поэтому вот как я это сделал, чтобы сэкономить чужое время:

Функция для копирования данных в буфер обмена, она также решает проблему получения строк вправильный порядок в результирующей строке:

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();
}

Очевидно, что это много скопировано по ссылке выше, просто упрощено, но я надеюсь, что это полезно.

...