2010-04-10 3 views
14

Come è possibile creare un codice DataTemplate (utilizzando C#) e quindi aggiungere un controllo a quello DataTemplate?Come definire un DataTemplate nel codice?

<data:DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Border> 
      <Border Margin="10" Padding="10" BorderBrush="SteelBlue" 
       BorderThickness="3" CornerRadius="5"> 
       <TextBlock Text="{Binding Description}" TextWrapping="Wrap" 
        FontSize="10"> 
       </TextBlock> 
      </Border> 
     </Border> 
    </DataTemplate> 
</data:DataGrid.RowDetailsTemplate> 

Sto usando Sivlerlight.

risposta

9

Per quanto ne so, l'unico modo per creare un DataTemplate in Silverlight è quello di utilizzare XamlReader. Fondamentalmente passeresti semplicemente XAML come stringa e ti restituirà un DataTemplate. La soluzione di Byron si applicherebbe a WPF ma Silverlight (per quanto a mia conoscenza) non supporta FrameworkElementFactory.

Scott Morrison: Defining Silverlight DataGrid Columns at Runtime

Annotare opzione # 2 per DataGridTemplateColumn.

+0

+1 Questo è corretto. Personalmente preferisco usare gli oggetti LinqToXml per creare l'Xaml necessario, ma alla fine una stringa di risultati deve essere passata a XamlReader per creare un DataTemplate a livello di codice. – AnthonyWJones

1

Microsoft ha un buon articolo su MSDN: "Data Templating Overview". Vorrei iniziare da lì.

Aggiornamento: Eh, grattalo. Ho letto il tuo requisito per "in codice". Lascerò qui il link per chiunque possa imbattersi in questo post.

4

È possibile aggiungere un controllo come un TextBlock utilizzando un FrameworkElementFactory. Quindi è possibile aggiungere TextBlock al VisualTree di DataTemplate. In questo modo:

//Create binding object and set as mode=oneway 
Binding binding = new Binding(); 
binding.Path = new PropertyPath("SomePropertyPathName"); 
binding.Mode = BindingMode.OneWay; 

//get textblock object from factory and set binding 
FrameworkElementFactory textElement = new FrameworkElementFactory(typeof(TextBlock)); 
textElement.SetBinding(TextBlock.TextProperty, binding); 

//apply textblock to datatemplate 
dataTemplate.VisualTree = textElement; 
+2

L'OP dice che sta usando Silverlight che, per quanto ne so, non supporta FrameworkElementFactory. – Josh

+0

Quindi lui è, mio ​​errore. –