1

データがコレクションである wpftoolkit データグリッドにデータを表示したい

public class Thing
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public List<Candidate> Candidates { get; set; }
}

public class Candidate
{

    public string Name { get; set; }
    public CandidateType CandidateType { get; set; }
}

public enum CandidateType
{
    Type1,
    Type2,
    Type42
}

候補リストの候補の数は、実行時に構成可能です。

望ましいグリッド レイアウトは次のようになります

Foo | Bar | Candidate 1 | Candidate 2 | ... | Candidate N

したがって、バインド式が変更されるため、xaml で候補の DataTemplate を作成できないようです。

次のように AutoGeneratedColumns イベントに必要な列を追加します。

private void DataGrid_AutoGeneratedColumns(object sender, EventArgs e)
{
    ViewModel vm = DataContext as ViewModel;

    for (int i = 0; i < vm.LotsOfThings.First().Candidates.Count; i++)
    {
        string assName = Assembly.GetExecutingAssembly().GetName().Name;
        ParserContext ctx = new ParserContext();
        ctx.XamlTypeMapper = new XamlTypeMapper(new string[] { assName });
        ctx.XamlTypeMapper.AddMappingProcessingInstruction("src", "WpfToolkitDataGridTester", assName);
        ctx.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
        ctx.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
        ctx.XmlnsDictionary.Add("src", "clr-namespace:WpfToolkitDataGridTester;assembly=" + assName);
        var template = XamlReader.Parse(@"<DataTemplate>
                                            <DataTemplate.Resources>
                                                <src:FooConverter x:Key='fooConverter' />
                                            </DataTemplate.Resources>
                                            <TextBlock  
                                                Foreground='{Binding Candidates[" + i + @"].CandidateType,Converter={StaticResource fooConverter}}'
                                                Text='{Binding Candidates[" + i + @"].Name}' />
                                        </DataTemplate>", ctx) as DataTemplate;
        dg.Columns.Add(new DataGridTemplateColumn
        {
            Header = "Candidate " + (i + 1),
            CellTemplate = template
        });
    }
}

ただし、これは次の例外で失敗します: タグ 'FooConverter' が XML 名前空間 'clr-namespace:WpfToolkitDataGridTester;assembly=WpfToolkitDataGridTester' に存在しません。行 '3' 位置 '54'。

StaticResource を DynamicResource に変更しても、変更はありません。

私は何が欠けていますか?

FWIW: ハードコードされたデータテンプレート

<DataTemplate x:Key="candidateTemplate">
  <DataTemplate.Resources>
    <src:FooConverter x:Key="fooConverter" />
  </DataTemplate.Resources>
  <TextBlock 
    Foreground="{Binding Candidates[0].CandidateType,Converter={StaticResource fooConverter}}"
    Text="{Binding Candidates[0].Name}" />
</DataTemplate>

およびそのように定義されたテンプレート列

<wpftk:DataGridTemplateColumn CellTemplate="{StaticResource candidateTemplate}" />

「動作」しますが、Candidates[0] がハードコーディングされているため、明らかに望ましい結果が得られません。

4

3 に答える 3

4

どういうわけか、私がこれを好きならそれは期待通りに動作します...

    string assName = Assembly.GetExecutingAssembly().GetName().Name;
    StringBuilder sb = new StringBuilder();
    sb.Append("<DataTemplate ");
    sb.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
    sb.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' ");
    sb.Append("xmlns:src='clr-namespace:WpfToolkitDataGridTester;assembly=" + assName + "' >");
    sb.Append("<DataTemplate.Resources>");
    sb.Append("<src:FooConverter x:Key='fooConverter' />");
    sb.Append("</DataTemplate.Resources>");
    sb.Append("<TextBlock ");
    sb.Append("Foreground='{Binding Candidates[" + i + "].CandidateType,Converter={StaticResource fooConverter}}' ");
    sb.Append("Text='{Binding Candidates[" + i + @"].Name}' />");
    sb.Append("</DataTemplate>");
    var template = (DataTemplate)XamlReader.Parse(sb.ToString());
于 2009-03-17T07:00:57.773 に答える
1

XAML ファイルが BAML にコンパイルされると、メモリ内ソースではなくアセンブリが参照されます。BAML は同じアセンブリにコンパイルされるため、実際の型はまだ利用できません。

短期的な回避策は、スタイルを一時的にコメントアウトし、プロジェクトをビルドしてから、スタイルを復元することです。

ただし、より永続的な解決策は、コンバーターを別のアセンブリに移動することです。

于 2009-04-30T09:29:46.117 に答える
0

それぞれではなくFooConverter、より高いレベルで(おそらくのリソースとして)1回を宣言するのに役立ちますか?DataGridDataTemplate

于 2009-03-16T22:16:43.557 に答える