Frage

Ich bin mit WPF mit .NET 3.0.

habe ich eine relativ einfache Datatemplate als Celltemplate definiert für eine Gridview. Ich erwarte, dass die VisualTree Eigenschaft Datatemplate ein Framework enthalten, aber die Eigenschaft ist null, wenn ich versuche, darauf zuzugreifen vom GridViewColumnHeader.Click Ereignisse. Warum ist die VisualTree null? Ich muss darauf zugreifen. Hier ist die Definition Listview:

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="28">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Und hier ist der Event-Handler:

private void Header_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
War es hilfreich?

Lösung

Dies ist das bekannte und erwartete Verhalten. Ich kann keine MSDN oder andere „autoritative“ citation jetzt finden, aber Diese MSDN-Foren posten erklärt (Art!):

  

FrameworkTemplate.VisualTree Eigenschaft   ... wird hauptsächlich verwendet, wenn Sie   programmatisch erstellen   Datatemplate / Control in Code,   Bei der Definition   Datatemplate / Control mit   XAML, wird diese Eigenschaft null sein,   weil verwendet WPF einen anderen Mechanismus   instanziieren und Konstrukt XAML   generierten Templates . (Schwerpunkt   hinzugefügt)

So ist die VisualTree Eigenschaft nicht aufgefüllt, wenn eine Vorlage aus XAML geladen wird. Es nur gefüllt wird, wenn Sie die Vorlage in Code Framework konstruieren

den Inhalt einer Vorlage in XAML definiert zu erhalten, rufen Sie FrameworkTemplate.LoadContent (). Dies wird eine Instanz der Vorlage materialisieren und Sie das Wurzelelement geben - Sie können dann in bohren nach Bedarf und legen Sie die Eigenschaften oder Bindungen. Es ist an Sie, die Instanz in das Aufnahmefenster materialisierte Schlitz oder visuelle Struktur der Kontrolle obwohl, so dass Sie wahrscheinlich diese verkapseln wollen!

Andere Tipps

Der Grund hinter der visuellen Baum ist gleich null ist, weil Visual Baum Eigenschaft näher an Logischen Baum statt Visual One . Die tatsächliche Inhalt der Vorlage wird gespeichert in Templatecontent Objekt, das keine öffentlichen Mitglieder hat, Sie zu verwenden Loadcontent Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top