2016-10-06 1 views
0

Ich möchte etwas Text in einem Flyout aktualisieren. Wenn ich jedoch versuche, seinen Wert im Code zu setzen, bekomme ich den Fehler "Der Name 'dateChoose' existiert im aktuellen Kontext nicht".x: Name existiert nicht im aktuellen Kontext, aber sein Elternteil tut

-Code hinter:

private void updateDateBinding() 
{ 
    lstMenus.Visibility = Visibility.Visible; 
    dateChosen.Text = ""; // <-- Error here 
} 

XAML-Code:

<ListView x:Name="lstMenus"> 

<!-- ...other code... --> 

     <TextBox x:Name="dateChosen" IsReadOnly="True" 
       Text="{Binding getDateChosen, Mode=TwoWay}"/> 

<!-- ...other code... --> 

    </ListView> 

Ursprünglich war ich nur gehen, das Property Ereignis zu verwenden, zu aktualisieren 'dateChosen' aber nicht aktualisiert, wenn dieses Ereignis aufrufen. Also habe ich beschlossen, den Wert explizit zu setzen, nur um dieses Problem zu finden.

Was mich verwirrt ist, dass 'lstMenus' genau so verändert werden kann, wie ich es erwarten würde. Wie kann mein ListView existieren, aber nicht die TextBox darin?

-

PS: Ich habe die meisten überflüssigen Codes aus diesem Schnitt (Höhe/Breite, Hintergrund, Ausrichtung, und so weiter), aber ich fühle mich soll ich erwähnen, dass die TextBox in Frage tief ist ziemlich in diesem Klumpen verschachtelt von Code. Die vollständige Vererbung:

Listview (lstMenus) - ListView.ItemTemplate - Datatemplate - Stackpanel - Grid - Grid - AppBarButton - AppBarButton.Flyout - Flyout - Grid - Grid - TextBox (dateChosen)

Ich habe versucht, Festlegen der 'x: Name' Eigenschaft für einige der dazwischenliegenden Tags, aber immer das gleiche "nicht im aktuellen Kontext" Problem, wenn ich versuche, sie aus dem Code dahinter zu erreichen.

+4

Die 'DataTemplate' ist nicht so" überflüssig ", wie Sie es sich vorgestellt haben. Die 'DataTemplate' kann nullmal, einmal oder tausend mal instanziiert werden. Auf welche dieser null oder mehr Instanzen von 'dateChoose' hast du gewartet, und wie hast du erwartet, dass das Framework die Antwort auf diese Frage rät? –

+0

Wenn Sie Vorlagen verwenden, sollten Sie diesen MVVM-Stil und nicht den winforms-event-handler-Stil verwenden (der bei XAML bestenfalls sehr schlecht funktioniert). –

+0

Ich hatte versucht, die Auswahl sichtbar zu machen, bevor ich die Auswahl im Rest meiner 'Menu'-Klasse hinzufügte/speicherte, aber basierend auf dem, was @EdPlunkett sagte, scheint es, ich muss es in meine Menü-Klasse einfügen, bevor ich es zuverlässig kann zeige es an. –

Antwort

1

Diese Frage kommt von Zeit zu Zeit auf. Schau mal hier: http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

Da das Steuerelement in einem generierten Container ist, ist es eigentlich nicht mehr im Bereich. Deshalb können Sie nicht darauf verweisen. Sie müssen die ListView nach dem Container fragen und dann den Container nach dem Element fragen. Dieser Blogartikel wird die Schritte erklären. Es ist gar nicht so schwer.

Denken Sie darüber nach, wenn Sie 10 Artikel in Ihrem ListView hätten, hätten Sie nicht 10 Artikel mit demselben Namen? Das kannst du natürlich nicht tun. Und deshalb gibt es dieses Problem. Das ListView muss den Bereich des unterordneten Elements einschränken, damit es nicht gegen einfaches OOP verstößt.

Verwandte Themen