2009-03-16 2 views
1

Я хочу, чтобы показать данные в wpftoolkit DataGrid, где данные коллекциядинамический DataTemplate с ValueConverter

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

Таким образом, кажется, что я не могу создать DataTemplate для кандидатов в XAML в качестве обязательного выражения будет меняться.

добавить необходимые столбцы в 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-имен: WpfToolkitDataGridTester; сборка = WpfToolkitDataGridTester. Строка '3' Позиция '54'.

Изменение значения StaticResource для DynamicResource не изменяет.

Что мне не хватает?

FWIW: а жёстко DataTemplate

<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}" /> 

'работает', но, очевидно, не дает желаемого результата, как кандидаты [0] является жёстко.

ответ

2

По какой-то причине, он работает, как ожидалось, если я сделаю так ...

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

Помогло ли объявление FooConverter раз на более высоком уровне (возможно, в качестве ресурса DataGrid), а не в каждом DataTemplate?

+0

Я тоже попробовал, это тоже не сработало. Я предполагаю, что причина в том, что XamlParser не найдет его, если он не в синтаксическом анализе. – mostlytech

1

Когда файлы XAML компилируются в BAML он ссылается на узел а не в источнике памяти. Поскольку BAML скомпилирован в ту же сборку, фактический тип пока недоступен.

Я обнаружил, что краткосрочное обходное решение заключается в том, чтобы временно прокомментировать стиль, построить проект, а затем восстановить стиль.

Более постоянное решение, однако, заключается в перемещении преобразователя на другую сборку.

Смежные вопросы