2017-03-17 277 views
2

我有一個Xamarin.Forms ListView和ItemTemplate。 ItemTemplate包含一個名爲「myEntry」的輸入控件。每次選擇一個項目時,我都要將焦點設置爲輸入控件。在我xaml.cs ListView_ItemSelected事件listView.FindByName( 「myEntry」)方法始終返回null:Xamarin.Forms FindByName()總是返回null

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> 

我也試圖從我的XAML找到其他控制,但它是始終爲空。 我做錯了什麼或者這是一個錯誤?

+0

@Mirja不管你有多少個listitems,你總是有一個入口控件? – greenhoorn

+0

每個listitem一個入口控件 – Mirja

+0

基本上,您將爲每個項目分配一個具有相同名稱的入口控件。 – greenhoorn

回答

5

警告:您不應在任何代碼中使用FindByName<>。而你正在嘗試使用Binding來完成。但我要回答。

myEntry是ListView單元格模板的一部分。試圖找到lv.FindByName<Entry>("myEntry")返回null,因爲其他備選方法將返回所有單元格的所有myEntry

它爲什麼會返回null?因爲你在不同的NameScope s。 Xaml解析器在您的文件中爲每個Xaml根對象創建一個NameScope,然後爲DataTemplates創建不同的NameScopes。

如果您想要關注活動Cell的myEntry。您將不得不找到選定的單元格,然後在單元格上使用FindByName。

但是,在模板控件中,沒有簡單的方法來獲取實際單元格上的鉤子。這就是爲什麼我以一個警告開始這個答案。再讀一遍。

+0

但返回所有myEntry會幫助我更多,因爲那麼我可以選擇正確的一個由列表視圖的選定索引或不是? – Mirja