7

列の単位の設定を表示および処理するボタンを含むカスタム ヘッダー (StackPanel に基づく) を持つ WPF テーブルがあります。これはうまく機能しますが、ヘッダーを含むデータをクリップボードにコピーできるようにしたいと考えています。

<DataGrid ClipboardCopyMode="IncludeHeader"
...
<DataGridTextColumn Header="Some Header" Binding={Binding Path=SomeValue}/>
<DataGridTextColumn Binding={Binding Path=OtherValue, Converter="{StaticResource unitsConverter}">
<DataGridTextColumn.Header>
<StackPanel>
<TextBlock Text="Period" />
<Button ... />
</Stackpanel>

問題は、カスタム ヘッダーを持つ列が次のようにクリップボードにコピーされることです。

SomeHeader System.Windows.Controls.StackPanel
v1         33

カスタム ヘッダーが使用されている場合、ヘッダーに出力されるテキストを変更する方法はありますか?

4

3 に答える 3

9

私は解決策を探し回った後、カスタム ヘッダー コントロールをサブクラス化して、正しいテキストをコピーするToString()ようにオーバーライドしました。ClipboardCopyMode="IncludeHeader"

私の場合、ヘッダーに画像を使用しました。

class HeaderImage : Image
{
    public override string ToString()
    {
        return Tag.ToString();
    }
}

Xaml:

 <DataGridCheckBoxColumn.Header>
     <elements:HeaderImage Source="..\Resources\skull.png" Width="15" Tag="Deprecated"/>
 </DataGridCheckBoxColumn.Header>

現在、コピー/貼り付けデータには、代わりに「非推奨」がありSystem.Windows.Controls.Imageます。で同じことができると確信していますStackPanel。便利なのでタグをヘッダーテキストとして使用しました

于 2013-06-05T12:50:04.383 に答える
1

テキスト ブロックを含む HeaderTemplate を使用するときに、この問題の解決策を探していました。私の場合、添付プロパティで問題を解決しました。ヘッダー テンプレートからテキストを取得し、それをヘッダー プロパティに設定しただけであることがわかります。このように、クリップボード コピー モードの IncludeHeader は期待どおりに機能します。

 /// <summary>  
 /// WPF Data grid does not know what is in a header template, so it can't copy it to the clipboard when using ClipboardCopyMode="IncludeHeader".  
 /// This attached property works with a header template that includes one TextBlock. Text content from the templates TextBlock is copied to the  
 /// column header for the clipboard to pick up.  
 /// </summary>  
public static class TemplatedDataGridHeaderText  
{  
 private static readonly Type OwnerType = typeof(TemplatedDataGridHeaderText);  
 public static readonly DependencyProperty UseTextFromTemplateProperty = DependencyProperty.RegisterAttached("UseTextFromTemplate", typeof(bool), OwnerType, new PropertyMetadata(false, OnHeaderTextChanged));  
 public static bool GetUseTextFromTemplate(DependencyObject obj)  
 {  
   return (bool)obj.GetValue(UseTextFromTemplateProperty);  
 }  
 public static void SetUseTextFromTemplate(DependencyObject obj, bool value)  
 {  
   obj.SetValue(UseTextFromTemplateProperty, value);  
 }  
 private static void OnHeaderTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  
 {  
   var textColumn = d as DataGridTextColumn;  
   if (textColumn == null) return;  
   if (textColumn.HeaderTemplate == null) return;  
   var headerTemplateTexblockText = textColumn.HeaderTemplate.LoadContent().GetValue(TextBlock.TextProperty).ToString();  
   textColumn.Header = headerTemplateTexblockText;  
 }  
}  

xamlは次のようになります....

 <DataGrid ItemsSource="{Binding }" AutoGenerateColumns="False" IsReadOnly="True" VerticalScrollBarVisibility="Auto" VerticalAlignment="Stretch">  
 <DataGrid.Columns>  
   <DataGridTextColumn Binding="{Binding FlowRate.UserValue, StringFormat=N3}" HeaderTemplate="{StaticResource FlowRate}"  
             attachedProperties:TemplatedDataGridHeaderText.UseTextFromTemplate="True"/>  
   <DataGridTextColumn Binding="{Binding Pressure.UserValue, StringFormat=N3}" HeaderTemplate="{StaticResource Pressure}"  
             attachedProperties:TemplatedDataGridHeaderText.UseTextFromTemplate="True"/>  
 </DataGrid.Columns>  

詳細については、こちらを参照してください... http://waldoscode.blogspot.com/2014/08/issue-using-wpf-datagrid-columnheader.html

于 2014-08-29T22:12:14.483 に答える