2015-02-10 5 views
0

Я пытаюсь добавить функцию копирования/вставки в приложение WPF. У меня есть DataGrid, который позволил выбрать целую строку. Строка является объектом типа AcquisitionParameters. Выбор в порядке, копия в буфер обмена тоже. После копирования в буфер обмена, я проверяю, были ли данные хорошо сериализованы, и это так. Но когда я пытаюсь извлечь объект из буфера обмена, я не могу десериализовать его в исходном формате, но в формате CSV.Сериализация и десериализация из буфера обмена (копирование/вставка)

private void dataGridAcquisitions_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e) 
{ 
    System.Windows.Clipboard.Clear(); 
    DataFormat format = System.Windows.DataFormats.GetDataFormat(typeof(AcquisitionParameters).FullName); 

    System.Windows.IDataObject dataObj = new System.Windows.DataObject(); 
    dataObj.SetData(format.Name, (AcquisitionParameters)e.Item, false); 
    System.Windows.Clipboard.SetDataObject(dataObj, true); 
    bool ispresent = dataObj.GetDataPresent(format.Name); // ok 
    AcquisitionParameters parameters = dataObj.GetData(format.Name) as AcquisitionParameters; //ok 
    if(parameters != null && ispresent) 
    { 
     //enter here 
    } 
} 


private void dataGridAcquisitions_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     System.Windows.IDataObject dataObj = System.Windows.Clipboard.GetDataObject(); //type of AcquisitionParameters not available, only HTML, CSV, etc. 
     string format = typeof(AcquisitionParameters).FullName; 

     if(dataObj.GetDataPresent(format)) //false 
     { 
     AcquisitionParameters parameters = dataObj.GetData(format) as AcquisitionParameters; 
     if(parameters != null) 
     { 
     } 
     }    
    } 
} 

И декларация моего класса AcquisitionParameters

namespace App 
{ 
    [Serializable] 
    public class AcquisitionParameters 
    { 
     private double pulse; 
     public double Pulse 
     { 
     get { return pulse; } 
     set { pulse = value; } 
     } 

     private double range; 
     public double Range 
     { 
     get { return range; } 
     set { range = value; } 
     } 

     private double offset; 
     public double Offset 
     { 
     get { return offset; } 
     set { offset = value; } 
     } 
    } 
} 

ответ

0

Попробуйте получить доступ к данным из Clipboard так:

object data = Clipboard.GetData("AcquisitionParameters"); 
if (data != null) return (AcquisitionParameters)data; 
return new AcquisitionParameters(); 

UPDATE >>>

Еслиэто не помогает, то попробуйте установить данные, как это:

DataObject dataObject = new DataObject(); 
dataObject.SetData("AcquisitionParameters", (AcquisitionParameters)e.Item, false); 
Clipboard.SetDataObject(dataObject); 
+0

Как я уже сказал, буфер обмена не содержит каких-либо данных моего пользовательского формата, только стандартный формат в DataFormats ... Этот код не очень отличается Мое печально. – GuillaumeA

+0

* Этот код на самом деле не похож на мою печально * ... нет? Хорошо работает шахта. – Sheridan

+0

Несомненно, что он работает в ваших условиях, версия, которую я предлагаю, работает при определенных условиях: сразу же после копирования данных в буфер обмена, но она терпит неудачу, когда я пытаюсь восстановить ее после Ctrl + V ... – GuillaumeA

Смежные вопросы