2013-02-19 8 views
5

Ich habe eine WPF-Tabelle mit einem benutzerdefinierten Header (basierend auf einem StackPanel), die eine Schaltfläche enthält, die zeigt und behandelt die Einstellung der Einheiten für die Spalte. Was funktioniert gut, aber ich möchte in der Lage sein, die Daten in die Zwischenablage einschließlich Kopfzeilen zu kopieren.Wpf DataGrid ClipboardCopyMode = "IncludeHeader" mit benutzerdefinierten Header

<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> 

Das Problem ist, dass Spalten mit der benutzerdefinierten Header in die Zwischenablage kopieren als

SomeHeader System.Windows.Controls.StackPanel 
v1   33 

Gibt es eine Möglichkeit zu ändern, welcher Text für die Kopfzeile gedruckt wird, wenn ein benutzerdefinierter Header verwendet wird?

Antwort

6

Ich stocherte nach einer Lösung und endete damit, mein benutzerdefiniertes Header-Steuerelement zu unterklassifizieren, nur um die ToString() zu überschreiben, so dass ClipboardCopyMode="IncludeHeader" den richtigen Text kopieren würde.

In meinem Fall habe ich ein Bild in meinem Header:

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> 

Nun ist die copy/paste-Daten "Veralten" statt System.Windows.Controls.Image haben. Ich bin sicher, Sie könnten das gleiche mit der StackPanel tun. Ich habe Tag als Header-Text verwendet, da es bequem war

+0

Danke @xerous und ja, es funktioniert tatsächlich auch für ein StackPanel. –

1

Ich suchte nach einer Lösung für dieses Problem, wenn Sie eine HeaderTemplate verwenden, die einen Textblock enthielt. In meinem Fall habe ich das Problem mit einer angehängten Eigenschaft gelöst. Sie können sehen, dass ich nur den Text aus der Header-Vorlage nehme und auf die Header-Eigenschaft setze. Auf diese Weise arbeitet der Zwischenablage-Kopiermodus IncludeHeader wie erwartet.

/// <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 wie folgt ....

<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> 

aussehen würde

Weitere Informationen finden Sie hier ... http://waldoscode.blogspot.com/2014/08/issue-using-wpf-datagrid-columnheader.html

0

ich die alternative AttachedProperty in GetFuzzy der Link verwendet http://waldoscode.blogspot.com/2014/08/issue-using-wpf-datagrid-columnheader.html. Der Autor (Don) erstellt eine AttachedProperty als (mit ein paar kleinen Mods meiner eigenen) folgt:

/// <summary> 
/// Allows binding a property to the header text. Works with the clipboard copy mode - IncludeHeaders. 
/// </summary> 
public static class DataGridHeaderTextAttachedProperty 
{ 
    private static readonly Type OwnerType = typeof(DataGridHeaderTextAttachedProperty); 
    public static readonly DependencyProperty HeaderTextProperty = DependencyProperty.RegisterAttached("HeaderText", typeof(string), OwnerType, new PropertyMetadata(OnHeaderTextChanged)); 

    public static string GetHeaderText(DependencyObject obj) 
    { 
    return (string)obj.GetValue(HeaderTextProperty); 
    } 

    public static void SetHeaderText(DependencyObject obj, string value) 
    { 
    obj.SetValue(HeaderTextProperty, value); 
    } 

    private static void OnHeaderTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
    var column = d as DataGridColumn; 
    if (column == null) return; 
    column.Header = GetHeaderText(column); 
    } 
} 

ich nicht in der Lage war, es zu bekommen zu arbeiten, wenn die Column.Header direkt einstellen konnte aber bekommt es mit dem Header wie unten zu arbeiten:

<DataGridTemplateColumn ... 
         ui:DataGridHeaderTextAttachedProperty.HeaderText="Some Text"> 
    <DataGridTemplateColumn.HeaderTemplate> 
     <DataTemplate> 
      <Path Data="{StaticResource SomeGeometry}" ... /> 
     </DataTemplate> 
    </DataGridTemplateColumn.HeaderTemplate> 

    ... 
</DataGridTemplateColumn> 

DANK GetFuzzy für ein ausgezeichnetes BLOG POST!