2013-07-04 18 views
11

Wygląda na to, że uderzyłem w ścianę próbując użyć DataTemplates na mojej karcie DataGrid. Próbuję użyć jednego szablonu, aby wyświetlić dwa wiersze tekstu dla każdej komórki. Ale nie wydaje się możliwe, aby powiązać kolumnę w jakikolwiek sposób.Oprawa DataGridTemplateColumn

Poniższy kod z nadzieją pokazuje, co chcę zrobić. Zauważ powiązanie dla każdej kolumny: nie ma czegoś takiego dla kolumny z szablonem i jako takie, xaml nie mógłby działać.

<Window.Resources> 
    <DataTemplate x:Key="DoubleField"> 
     <StackPanel> 
      <TextBlock Text="{Binding Value1}"/> 
      <TextBlock Text="{Binding Value2}"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Title}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Price}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Stuff}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
    </DataGrid.Columns> 
</DataGrid> 

class MyListItem { 
    class DoubleItem { 
     string Value1 { get; set; } 
     string Value2 { get; set; } 
    }  
    DoubleItem Title { get; set; } 
    DoubleItem Price { get; set; } 
    DoubleItem Stuff { get; set; } 
} 

Czy jestem skazany na skopiowanie całego DataTemplate do każdej kolumny tylko po to, aby mieć inne powiązanie z każdą z kopii? Z pewnością jest dobry sposób na obejście tego? Czy też po prostu znowu brakuje mi czegoś oślepiająco oczywistego?

+0

"Czy ja po prostu tęsknię za czymś znowu oślepiającym?" - wszyscy już tam byliśmy, szczególnie z WPF. –

Odpowiedz

4

Nie jestem całkowicie pewien, co próbujesz zrobić, ale jeśli chcesz uzyskać DataContext całego rzędu, możesz użyć wiązania RelativeSource, aby przejść do drzewa wizualnego. Tak jak w przypadku:

<DataTemplate x:Key="DoubleField"> 
    <StackPanel> 
     <TextBlock Text="{Binding DataContext.Value1, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/> 
     <TextBlock Text="{Binding DataContext.Value2, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/> 
    </StackPanel> 
</DataTemplate> 
+1

Problemem jest brak możliwości wiązania, gdy definiuję tabelę topplatową. Wydaje mi się, że nie ma sposobu, aby powiedzieć, że pierwsza kolumna powinna nadać polu Tytuł do pokazania szablonu. –

+0

Datatemplate kolumny szablonu jest już dostarczony z kontekstem danych wiersza. – Gman