2011-10-19 4 views
4

J'essaye de charger un DataTemplate en code-behind, mais cela fonctionne très bien si je supprime le convertisseur ... mais dès que je le mets dedans, il souffle. Maintenant, j'ai défini mon état de mon état et placé la référence à mon convertisseur dans XAML. par exemple:DataTemplate avec convertisseur dans le code derrière

<Window.Resources> 
    <local:StatCellConverter x:Key="myConverter" /> 
</Window.Resources> 

et c'est ma méthode où je produis un DataTemplate:

private DataTemplate GenerateStatRowDataTemplate() 
{ 
    ParserContext pc = new ParserContext(); 
    pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
    pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
    pc.XmlnsDictionary.Add("xcdg", "http://schemas.xceed.com/wpf/xaml/datagrid"); 

    string statRowTemplate = "<DataTemplate><xcdg:StatRow>"; 
    statRowTemplate += "<xcdg:StatCell FieldName=\"Column4\" ResultPropertyName=\"AvgColumn4\">"; 
    statRowTemplate += "<xcdg:StatCell.ContentTemplate>"; 
    statRowTemplate += "<DataTemplate>"; 
    statRowTemplate += "<TextBlock Text=\"{Binding ., Converter={StaticResource ResourceKey=myConverter}}\" />"; 
    statRowTemplate += "</DataTemplate>"; 
    statRowTemplate += "</xcdg:StatCell.ContentTemplate>"; 
    statRowTemplate += "</xcdg:StatCell>"; 
    statRowTemplate += "</xcdg:StatRow>"; 
    statRowTemplate += "</DataTemplate>"; 

    StringReader stringReader = new StringReader(statRowTemplate); 
    XmlReader xmlReader = XmlReader.Create(stringReader); 
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(statRowTemplate.ToString())); 
    DataTemplate dt = (DataTemplate)XamlReader.Load(ms,pc); 
    dt.LoadContent(); 
    return dt; 
} 

Qu'est-ce que je fais mal? Serait-ce que je devrais aussi définir mon convertisseur en code?

Mon Converter

public class StatCellConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      Debug.WriteLine(value); 

      if (value.Equals("#DIV/0#")) 
       return "0"; 
      return value; 
     } 
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

je reçois une exception en disant qu'il ne peut pas charger le DataTemplate

+0

S'il vous plaît poster votre votre convertisseur et de définir « il coups " – Paparazzi

+0

J'ai modifié la question –

+3

Je l'ai compris. J'ai dû mettre les ressources dans le code derrière ... chaîne statRowTemplate = ""; statRowTemplate + = ""; –

Répondre

3

C'est en fait un bug dans le cadre. Ajout de l'espace de nom local à travers le XmlnsDictionary ne fonctionnerait pas. Il faut ajouter à la définition du modèle avec l'ensemble et espace de nom défini:

comme dans le commentaire ci-dessus par @Nerd En formation cela devrait fonctionner:

string statRowTemplate = "<DataTemplate >"; 

private DataTemplate GenerateStatRowDataTemplate() 
{ 
    ParserContext pc = new ParserContext(); 
    pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
    pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
    pc.XmlnsDictionary.Add("xcdg", "http://schemas.xceed.com/wpf/xaml/datagrid"); 

    string statRowTemplate = "<DataTemplate xmlns:local=\"clr-namespace:MyTest;assembly=MyTest\" ><xcdg:StatRow>"; 
    statRowTemplate += "<xcdg:StatCell FieldName=\"Column4\" ResultPropertyName=\"AvgColumn4\">"; 
    statRowTemplate += "<xcdg:StatCell.ContentTemplate>"; 
    statRowTemplate += "<DataTemplate>"; 
    statRowTemplate += "<TextBlock Text=\"{Binding ., Converter={StaticResource ResourceKey=myConverter}}\" />"; 
    statRowTemplate += "</DataTemplate>"; 
    statRowTemplate += "</xcdg:StatCell.ContentTemplate>"; 
    statRowTemplate += "</xcdg:StatCell>"; 
    statRowTemplate += "</xcdg:StatRow>"; 
    statRowTemplate += "</DataTemplate>"; 

    StringReader stringReader = new StringReader(statRowTemplate); 
    XmlReader xmlReader = XmlReader.Create(stringReader); 
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(statRowTemplate.ToString())); 
    DataTemplate dt = (DataTemplate)XamlReader.Load(ms,pc); 
    dt.LoadContent(); 
    return dt; 
} 
+0

Micangello ... puisque vous étiez assez gentil pour répondre à ma question en utilisant ma réponse ... Je vais vous donner la coche réponse Stackoverflow :) Ah cool merci –

+0

Ajout de l'espace de nom local à travers le 'XmlnsDictionary' ** fait ** fonctionne aussi de la même manière: l'important est de spécifier le ** assembly ** comme vous l'avez fait dans le xaml, ce qui donne la ligne suivante 'pc.XmlnsDictionary.Add (" local "," clr- namespace: MyTest; assembly = MyTest "); ' –

Questions connexes