2010-09-22 5 views
3

Je suis en train de construire les éléments suivants DataTemplate en C#Construire un DataTemplate en C#

<DataTemplate x:Key="lbl"> 
     <!-- Grid 2x2 with black border --> 
     <Border BorderBrush="Black"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <!-- x-coordinate --> 
       <TextBlock Text="X=" /> 
       <TextBlock Grid.Column="1" Text="{Binding Path=[XValues], Converter={x:Static my:Converters.Format}, ConverterParameter=#.##}"/> 
       <!-- y-coordinate --> 
       <TextBlock Grid.Row="1" Text="Y=" /> 
       <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Value, Converter={x:Static my:Converters.Format}, ConverterParameter=#.##}" /> 
      </Grid> 
     </Border> 
    </DataTemplate> 

J'ai obtenu jusqu'ici et je ne peux pas comprendre la Grid.ColumnDefinitions et je reçois une exception

FrameworkElementFactory doit être dans un modèle scellé pour cette opération.

private static DataTemplate GetToolTipsDataTemplate() 
{ 
     FrameworkElementFactory grid = new FrameworkElementFactory(typeof(Grid)); 

     FrameworkElementFactory x = new FrameworkElementFactory(typeof(TextBlock)); 
     x.SetBinding(TextBlock.TextProperty, new Binding("X=")); 
     grid.AppendChild(x); 

     FrameworkElementFactory xValue = new FrameworkElementFactory(typeof(TextBlock)); 
     xValue.SetValue(TextBlock.TextProperty, "{Binding Path=[XValues], Converter={x:Static my:Converters.Format}, ConverterParameter=#.##}"); 
     grid.AppendChild(xValue); 

     FrameworkElementFactory y = new FrameworkElementFactory(typeof(TextBlock)); 
     y.SetBinding(TextBlock.TextProperty, new Binding("Y=")); 
     grid.AppendChild(y); 

     FrameworkElementFactory yValue = new FrameworkElementFactory(typeof(TextBlock)); 
     yValue.SetValue(TextBlock.TextProperty, "{Binding Path=Values, Converter={x:Static my:Converters.Format}, ConverterParameter=#.##}"); 
     grid.AppendChild(yValue); 

     FrameworkElementFactory border = new FrameworkElementFactory(typeof(Border)); 
     border.SetValue(Border.BorderBrushProperty, System.Windows.Media.Brushes.Black); 
     border.AppendChild(grid); 

     DataTemplate dt = new DataTemplate {VisualTree = border}; 
     return dt; 
    } 

Toute aide serait appréciée.

Répondre

0

Je suis allé dans une direction différente et l'ai mis au travail, sauf pour le formatage sur la liaison.

private static DataTemplate GetToolTipsDataTemplate() 
    { 
     XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
     XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml"; 
     XNamespace my = "clr-namespace:C1.WPF.C1Chart;assembly=C1.WPF.C1Chart"; 
     XElement xDataTemplate = 
      new XElement(ns + "DataTemplate", 
       new XElement(ns + "Border", 
        new XAttribute("BorderBrush", "Black"), 
        new XElement(ns + "Grid", 
         new XElement(ns + "Grid.ColumnDefinitions", 
          new XElement(ns + "ColumnDefinition"), 
          new XElement(ns + "ColumnDefinition")), 
         new XElement(ns + "Grid.RowDefinitions", 
          new XElement(ns + "RowDefinition"), 
          new XElement(ns + "RowDefinition")), 
         new XElement(ns + "TextBlock", 
          new XAttribute("Text", "X=")), 
         new XElement(ns + "TextBlock", 
          new XAttribute("Text", "{Binding Path=[XValues]}"), //, Converter={" + x +"Static " + my + "Converters.Format}, ConverterParameter=#.##}"), 
          new XAttribute("Grid.Column", "1")), 
         new XElement(ns + "TextBlock", 
          new XAttribute("Text", "Y="), 
          new XAttribute("Grid.Row", "1")), 
         new XElement(ns + "TextBlock", 
          new XAttribute("Text", "{Binding Path= [Values]}"), //, Converter={" + x +":Static " + my + ":Converters.Format}, ConverterParameter=#.##}"), 
          new XAttribute("Grid.Column", "1"), 
          new XAttribute("Grid.Row", "1")) 
          ))); 

     StringReader sr = new StringReader(xDataTemplate.ToString()); 
     XmlReader xr = XmlReader.Create(sr); 

     DataTemplate dataTemplateObect = System.Windows.Markup.XamlReader.Load(xr) as DataTemplate; 

     return dataTemplateObect; 
    }