Customizing Automatisch Generierten Spalten im DataGrid-Steuerelement
Nach dem Lesen der exzellenten Artikel auf, wie Anpassen Von Automatisch Generierten Spalten, ich habe ein Problem.
Beim Versuch zum anpassen von automatisch generierten Spalten in einer DataGrid
kontrollieren, ich möchte, einfache Dinge zu tun wie stellen Sie sicher, dass alle numerischen Werte in der Spalte werden rechts ausgerichtet. Zu diesem Zweck habe ich eine DataTemplate
wie folgt:
<DataGrid x:Name="MyGrid" AutoGeneratingColumn="MyGrid_AutoGeneratingColumn">
<DataGrid.Resources>
<DataTemplate x:Key="IntegerTemplate">
<TextBlock Text="{Binding}" HorizontalAlignment="Right"/>
</DataTemplate>
</DataGrid.Resources>
</DataGrid>
Dann, in der AutoGeneratingColumn
DataGrid
event-handler, will ich weisen Sie dieses generischen DataTemplate
als CellTemplate
für alle Integrale (d.h., die numerische Spalten):
public void MyWindow_AdjustColumnTemplateBasedOnType(
DataGridAutoGeneratingColumnEventArgs e)
{
if (/*This is a column I want to change*/)
{
DataGridTemplateColumn column=new DataGridTemplateColumn();
column.Header=e.PropertyName;
column.CellTemplate=MyGrid.FindResource("IntegerTemplate") as DataTemplate;
e.Column=column;
}
}
Das problem ist, dass der Wert der Text
Spalte der TextBlock
nicht die gewünschten Ergebnisse angezeigt werden. Statt zu sehen, die Rechtsbündig Wert in jeder Zelle, deren Spalte hat dieses DataTemplate
als seine CellTemplate
sehe ich:
Mithilfe der leere bindungssyntax verwendet, indem das Attribut Text
zu "{Binding}"
ist offensichtlich falsch. Einstellung einen Pfad basierend Bindung nicht produzieren das gewünschte Ergebnis. Das heißt, wenn ich einen (hart-kodierten Daten Weg) - Bindung mit so etwas wie:
<DataGrid.Resources>
<DataTemplate x:Key="IntegerTemplate">
<!-- Binding hard set to ProductId -->
<TextBlock Text="{Binding ProductId}" HorizontalAlignment="Right"/>
</DataTemplate>
</DataGrid.Resources>
Dann ist alles gut, aber meine generic DataTemplate
ist nicht mehr generisch. Anstatt dass es wiederverwendbar für alle integer-Spalten, es kann nur verwendet werden, für die ProductId
Spalte, da die Bindung ist fest auf den Wert des bestimmten Daten-Postens:
Was ist die richtige Bindung sollte ich verwenden, so dass die generische DataTemplate
tatsächlich verwendet, was Wert ist in der entsprechenden ItemSource
- Eigenschaft für die Spalte mit dem es verbunden ist.
- Michael Goldshteyn :ich habe das gleiche problem,Hast du eine Lösung finden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Stile lösen Ihr Problem hier .
und in XAML schreiben Sie
Style
statt einerDataTemplate
Für Menschen kämpfen mit dem "Was ist die richtige Bindung sollte ich verwenden, so dass die generische DataTemplate tatsächlich verwendet, was Wert ist in der entsprechenden ItemSource-Eigenschaft für die Spalte mit dem es verbunden ist."
Sehen Jay_Wang die Antwort in diesem link:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062
Wichtige bit überschreiben, das System.Windows.FrameworkElement GenerateElement Funktion, so dass Sie können programmatisch einstellen, bis die Bindung an die Spalte-Namen.
Hoffe, das hilft.
Bei Verwendung einer TemplateColumn im DataGrid Kontext Sie in der Regel verwenden Sie ein ValueConverter als gut.
Diese ValueConverter konvertiert die Daten aus, die Sie ViewModels-Objekt (das ist in der Tat der Grund, warum Sie wollen, zu einem TemplateColum statt eines gewöhnlichen TextColumn) auf eine Darstellbare Zeichenfolge bilden.
Haben Sie wie ein converter oder bieten Sie eine ToString () - Methode in Ihrer ViewModels Objekt ? Wenn nicht, probieren Sie es aus, vielleicht hilft das ...