2011-10-19 17 views
4

コードビハインドでDataTemplateをロードしようとしていますが、コンバーターを削除するとうまく動作しますが、そこに置くとすぐに吹きます。さて、私は自分の状態空間をネームスペースに設定し、XAMLのコンバータへの参照を配置しました。例えば:コード内のコンバーターを使用したDataTemplate

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

、これは私がする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; 
} 

何をしているのですか?私のコンバーターもコードの中に定義しなければならないのでしょうか?

マイコンバータ

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(); 
     } 
    } 

私はそれが実際にはDataTemplateを

+0

あなたのごコンバータを投稿し、「それを定義してください吹く " – Paparazzi

+0

私は質問を編集しました –

+3

私はそれを理解しました。コードの後ろにリソースを設定する必要がありました... string statRowTemplate = ""; statRowTemplate + = ""; –

答えて

3

にこれを読み込むことができないという例外を取得は、フレームワークのバグです。 XmlnsDictionaryを使用してローカルの名前空間を追加しても機能しません。 これは、定義されたアセンブリと名前空間をテンプレート定義の中に追加する必要があります。

トレーニングで@Nerdことによって、上記のコメント、これは動作するはずのように:

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 ...あなたは私の答えを使って私の質問に答えるのに十分なので、私はあなたにStackoverflow答えのチェックマーク:)を与えるでしょうああクール感謝 –

+0

'XmlnsDictionary'を介してローカル名空間を追加する** **同様の方法で動作します:xamlで行ったように、**アセンブリ**を指定することが重要です。その結果、次の行が生成されます。 'pc.XmlnsDictionary.Add(" local "、" clr-名前空間:MyTest; assembly = MyTest "); ' –

関連する問題