2009-03-05 18 views
2

Ich möchte DataGridTemplateColumns basierend auf meiner Datenquelle programmgesteuert erstellen können. Wenn meine Quelle beispielsweise ein Datum in einer bestimmten Spalte hat, würde ich gerne ein Datepicker-Steuerelement verwenden können. Ich weiß, dass dies mit xaml und einer DataGridTemplateColumn zur Entwurfszeit leicht erreicht wird, wie würde ich dies jedoch zur Laufzeit erreichen?Programmgesteuertes Erstellen von WPF DataGridTemplateColumn für DataGrid

Ist meine beste Option XamlReader.Load oder eine eher traditionelle Route wie:

Dim TempCol As Microsoft.Windows.Controls.DataGridTemplateColumn

Ich habe keinen Erfolg mit den letzteren hat.

Danke.

-Paul

Edit: Dies ist der Code, den ich verwenden wollte:

 Dim TempCol As New Microsoft.Windows.Controls.DataGridTemplateColumn 

    TempCol.CellEditingTemplate = DataTemplate.Equals(DatePicker) 

I erhalten Datepicker ein Typ ist und nicht als Ausdruck verwendet werden.

Ich basiere dies auf der WPF Toolkit-Demo. http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx

<dg:DataGridTemplateColumn Header="Date" MinWidth="100"> 
    <dg:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <dg:DatePicker SelectedDate="{Binding Date}" SelectedDateFormat="Short" /> 
     </DataTemplate> 
    </dg:DataGridTemplateColumn.CellEditingTemplate> 
    <dg:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Date, StringFormat=d}" /> 
     </DataTemplate> 
    </dg:DataGridTemplateColumn.CellTemplate> 
</dg:DataGridTemplateColumn> 

Dank!

+0

Konnten Sie den genauen Code posten, den Sie verwendeten, um die Schablonenspalte zu erzeugen? – Andy

+0

Lassen Sie mich wissen, ob ich noch etwas hinzufügen sollte. Danke. – PaulWaldman

Antwort

4

Der Grund, dass Ihr Code funktioniert nicht, weil Sie den Wert der CellEditingTemplate Spalte zu einem bool (dem Ergebnis setzen DataTemplate.Equals() des Aufrufs, anstatt eine Instanz der Vorlage in Code zu erstellen.

können Sie eine Vorlage in Code erstellen so etwas wie dies unter Verwendung von (entspricht dem XAML-Code-Snippet Sie zur Verfügung gestellt.):

DataGridTemplateColumn col = new DataGridTemplateColumn(); 
col.Header = "Date"; 

// Create a factory. This will create the controls in each cell of this 
// column as needed. 
FrameworkElementFactory factory = 
    new FrameworkElementFactory(typeof(DatePicker)); 

// Bind the value of this cell to the value of the Date property of the 
// DataContext of this row. The StringFormat "d" will be used to display 
// the value. 
Binding b = new Binding("Date"); 
b.StringFormat = "d"; 
factory.SetValue(DatePicker.SelectedDateProperty, b); 

// Create the template itself, and add the factory to it. 
DataTemplate cellEditingTemplate = new DataTemplate(); 
cellEditingTemplate.VisualTree = factory; 

col.CellEditingTemplate = cellEditingTemplate; 

ich bin nicht sicher, ob dieser Ansatz besser funktionieren würde als die XAML Laden Sie sich vielleicht beide Ansätze versuchen und sehen, welches funktioniert am besten für dich und arbeitet schneller?

+0

Andy, Danke für Ihre Antwort. Ich hatte den Eindruck, dass FrameworkElementFactory in Zukunft nicht unterstützt wird. Siehe diese Antwort als Referenz. http://stackoverflow.com/questions/617052/how-can-i-convert-this-xaml-code-into-c-code/617799#617799 Nochmals vielen Dank, -Paul – PaulWaldman

+0

Ich habe nicht gehört über diese eine oder die andere Art. Klingt wie XamlReader könnte dann der Weg sein. – Andy

Verwandte Themen