2017-10-27 5 views
0

Ich habe eine ListView, die DataTemplates verwendet. Wenn ich dies in einem ListView verwende, das die Spalten über XAML definiert, funktioniert es wie es soll. Meine DataTemplates werden aus meiner Sicht verwendet. Aber wenn ich die gleichen DataTemplates in einem zweiten ListView verwenden möchte, wo ich dem ListView neue Spalten hinzufüge, verwendet es nicht mein DataTemplate. Was soll ich machen?WPF GridViewColumn.CellTemplate DataTemplate ContentPresenter

Der Code in XAML für das erste Listview wie folgt aussieht:

<GridViewColumn x:Name="lvSecondColumn" Header="Value" Width="200"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
     <ContentPresenter Content="{Binding}"/> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

My-Code i zum Erzeugen einer Spalte in der zweiten Listview verwenden ist:

DataColumn dc = (DataColumn)colum; 

GridViewColumn column = new GridViewColumn(); 
column.DisplayMemberBinding = new Binding(dc.ColumnName)); 
column.Header = dc.ColumnName; 
TestColumns.Columns.Add(column); 

TestListView.ItemsSource = dt.DefaultView; 

In WPFInspector ich sehe, gibt es keine ContentPresenter in meiner dynamisch generierten Spalte. Picture from missing ContentPresenter from WPFInspector Wie kann ich den ContentPresenter zu meiner dynamischen Spalte hinzufügen ???

Antwort

0

Sie können sowohl Binding als auch DataTemplate nicht festlegen. Nach dem docs https://msdn.microsoft.com/en-us/library/system.windows.controls.gridviewcolumn.displaymemberbinding(v=vs.110).aspx

Die folgenden Eigenschaften werden verwendet, um den Inhalt und Stil eine Spalte Zelle zu definieren, und werden in der Reihenfolge ihrer Priorität aufgelistet, vom höchsten zum niedrigsten: - DisplayMemberBinding - Celltemplate - CellTemplateSelector

Wenn Sie Bindung verwenden, dann wird es ein Textfeld mit einem „.ToString()“ des gebundenen Objekts erzeugen. Wenn Sie die Struktur Ihrer Elemente in der ListView kennen, können Sie einfach DataTemplates mit entsprechenden Bindings darin erstellen. Bei der dynamischen Generierung von Spalten ist dies jedoch ein Problem.

Sie können dynamisch eine Datatemplate für Ihre Spalte erzeugen und die Bindung in sie integrieren:

public DataTemplate CreateColumnTemplate(string property) 
{ 
    StringReader stringReader = new StringReader(
    @"<DataTemplate 
     xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
      <ContentPresenter Content=""{Binding " + property + @"}""/> 
     </DataTemplate>"); 
    XmlReader xmlReader = XmlReader.Create(stringReader); 
    return XamlReader.Load(xmlReader) as DataTemplate; 
} 

Dann können Sie Ihre Spalten wie folgt erzeugen:

GridViewColumn column = new GridViewColumn(); 
column.CellTemplate = CreateColumnTemplate(dc.ColumnName); 
column.Header = dc.ColumnName; 
TestColumns.Columns.Add(column); 

ich den Code nicht ausgeführt wurde Es kann kleine Fehler geben.

+0

Danke für Ihre Antwort. Und das ist richtig. Dazu habe ich 2 ListViews zum Testen verwendet. Die eine, wo ich die Bindung von XAML verwende und es funktioniert. Der andere ListView entwirft die Spalten zur Laufzeit und das funktioniert nicht korrekt. Es erzeugt nur eine Textbox mit einem ".ToString()" Inhalt. Aber ich möchte in der dynamischen Textbox auch mein DataTemplate verwenden. Nicht das Standard-Textfeld. Also wie man den im Code einstellt? – CPipe

+0

Sie können Datenvorlagen dynamisch mit xamlReader pro Spalte kompilieren. Ich habe es in die Antwort eingefügt. – Dmitry

+0

Hat es dein Problem gelöst? – Dmitry

Verwandte Themen