2017-03-17 6 views
2

Ich habe eine Xamarin.Forms ListView mit ItemTemplate. Das ItemTemplate enthält ein Eintragssteuerelement mit dem Namen "myEntry". Jedes Mal, wenn ein Element ausgewählt wird, möchte ich den Fokus auf das Eingabesteuerelement legen. In meinem xaml.cs ListView_ItemSelected Ereignis der listView.FindByName ("MyEntry") Methode gibt immer null:Xamarin.Forms FindByName() gibt immer null zurück

private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
{ 
    var lv = sender as ListView; 
    if (lv != null) 
    { 
    var entry = lv.FindByName<Entry>("myEntry"); 
    if (entry != null) 
     entry.Focus(); 
    } 
} 

XAML:

<ListView ItemsSource="{Binding ArtikelListe}" 
      Header="" 
      HasUnevenRows="True" 
      ItemSelected="ListView_ItemSelected" 
      ItemTapped="ListView_ItemTapped"> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
     <ViewCell> 
      <Grid Margin="5"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="250*"/> 
       <ColumnDefinition Width="150*"/> 
       <ColumnDefinition Width="100*"/> 
       <ColumnDefinition Width="100*"/> 
       <ColumnDefinition Width="100*"/> 
       <ColumnDefinition Width="75*"/> 
       <ColumnDefinition Width="75*"/> 
       <ColumnDefinition Width="250*"/> 
      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 

      <Label Text="{Binding Bezeichnung}"/> 
      <Label Grid.Column="1" Text="{Binding ArtikelNr}"/> 
      <Label Grid.Column="2" Text="{Binding KatalogNr}"/> 
      <Label Grid.Column="3" Text="{Binding Lagerplatz}"/> 
      <Label Grid.Column="4" Text="{Binding Mengeneinheit}"/> 
      <Label Grid.Column="5" Text="{Binding Sollbestand}"/> 
      <Entry x:Name="myEntry" Grid.Column="6" VerticalOptions="StartAndExpand" Text="{Binding AktuellerBestand}"/> 
      <Label Grid.Column="7" Text="{Binding Kommentar}"/> 
      </Grid> 
     </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </ListView> 

Ich habe auch versucht, andere Kontrollen von meiner XAML zu finden, aber es ist immer Null. Mache ich etwas falsch oder ist das ein Fehler?

+0

@Mirja Sie haben immer eine Eingabesteuerung, unabhängig davon, wie viele Listen Sie haben? – greenhoorn

+0

Ein Eintragssteuerelement pro Listenelement – Mirja

+0

Grundsätzlich weisen Sie jedem Element ein Eintragssteuerelement mit demselben Namen zu. – greenhoorn

Antwort

5

WARNUNG: Sie sollten FindByName<> in keinem Code verwenden. Und was Sie tun möchten, wäre mit Binding getan. Aber ich werde trotzdem antworten.

myEntry ist Teil der Vorlage für die Zelle Ihres ListView. Der Versuch, lv.FindByName<Entry>("myEntry") zu finden, gibt null zurück, weil die andere Alternative ALL myEntry aller Zellen zurückgeben würde.

Warum gibt es zurück null? Weil du in verschiedenen NameScope s bist. Der Xaml-Parser erstellt ein NameScope pro Xaml-Root-Objekt in Ihrer Datei und anschließend verschiedene NameScopes für DataTemplates.

Wenn Sie die myEntry der aktiven Zelle konzentrieren möchten. Sie müssten die ausgewählte Zelle finden und dann FindByName für die Zelle verwenden.

Aber es gibt keinen einfachen Weg, in einem Vorlagen-Steuerelement einen Haken an der eigentlichen Zelle zu bekommen. Deshalb habe ich diese Antwort mit einer Warnung begonnen. Lies es nochmals.

+0

Aber die Rückgabe aller myEntry würde mir mehr helfen, denn dann könnte ich den richtigen nach dem ausgewählten Index der Listview auswählen oder nicht? – Mirja

Verwandte Themen