2010-04-12 83 views
3

我最近開始使用帶有包含WPF AutoCompleteBox的DataGridTemplateColumns的WPF Datagrid,但是我在實現這些DataGridTemplateColumns的Clipboard.Paste功能時遇到了麻煩。WPF DataGrid與DataGridTemplateColumns的粘貼功能

我已經設法通過Vishal的指南here使用內置DataGridColumns的Clipboard.Paste,但它不適用於DataGridTemplateColumns。

在DataGridColumn類的OnPastingCellClipboardContent方法中,似乎fe.GetBindingExpression(CellValueProperty)返回null而不是所需的BindingExpression。

任何人都可以指向正確的方向嗎?

public virtual void OnPastingCellClipboardContent(object item, object cellContent) 
    { 
     BindingBase binding = ClipboardContentBinding; 
     if (binding != null) 
     { 
      // Raise the event to give a chance for external listeners to modify the cell content 
      // before it gets stored into the cell 
      if (PastingCellClipboardContent != null) 
      { 
       DataGridCellClipboardEventArgs args = new DataGridCellClipboardEventArgs(item, this, cellContent); 
       PastingCellClipboardContent(this, args); 
       cellContent = args.Content; 
      } 

      // Event handlers can cancel Paste of a cell by setting its content to null 
      if (cellContent != null) 
      { 
       FrameworkElement fe = new FrameworkElement(); 
       fe.DataContext = item; 
       fe.SetBinding(CellValueProperty, binding); 
       fe.SetValue(CellValueProperty, cellContent); 

       BindingExpression be = fe.GetBindingExpression(CellValueProperty); 

     be.UpdateSource(); 

    } 

} 

謝謝!

回答

0

這是因爲對於DataGridTemplateColumns,沒有綁定。綁定在您的數據模板中處理。單元格數據模板只獲取項目(行中的項目)並綁定到它。列沒有辦法知道單元格中的內容。

我已經通過創建自己的列來解決這個問題。我從DataGridTextColumn派生(如果我正在做一個有文本輸入的),並重寫GenerateElement和GenerateEditingElement。

這樣我仍然有可以用於粘貼的綁定屬性。

0

使用ClipboardContentBinding如圖所示:

<DataGridTemplateColumn 
    Header="First Name" 
    SortMemberPath="FirstName" 
    ClipboardContentBinding="{Binding FirstName}" 
    > 
    <DatGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding FirstName}" /> 
     </DataTemplate> 
    </DatGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     ... 
    </DataGridTemplateColumn> 
</DataGridTemplateColumn> 

here服用。

+0

這不適用於WPFToolkit 2010年2月發行版以及其他版本。 – Falcon 2011-08-23 08:19:56

+0

這是記錄在某處嗎,還是通過測試發現的? ClipboardContentBinding作爲[DataGridColumn.cs]中的一個屬性存在(http://wpf.codeplex.com/SourceControl/changeset/view/40156#1544286) – Pakman 2011-08-23 14:14:46

+0

我知道它存在,並且我已經追蹤了錯誤OP。如果仔細觀察OP發佈的代碼,那麼您會意識到儘管正在使用ClipboardContentBinding,但它會失敗。我已經通過反射寫了一個解決方法,因爲我不想創建自定義列。簡而言之:不,不適用於WPFToolkit的模板列。不過,我不知道有關.NET 4的WPF。 – Falcon 2011-08-23 14:17:58

1

使用ClipboardContentBinding並將綁定的模式設置爲TwoWay,似乎可行。

GetBindingExpression然後返回一些不爲null(ClipboardContentBinding上的綁定)並且UpdateSource不會失敗。

我想這個解決方案僅限於在源代碼上觸發PropertyChanged事件的情況,該事件又會更新列的DataTemplate中的控件。