Xamarin.Forms FindByName()始终返回null

时间:2017-03-17 09:20:21

标签: c# xaml xamarin xamarin.forms

我有一个带有ItemTemplate的Xamarin.Forms ListView。 ItemTemplate包含一个名为" myEntry"的条目控件。每次选择一个项目时,我都想将焦点设置到输入控件。在我的xaml.cs ListView_ItemSelected事件中,listView.FindByName(" myEntry")方法始终返回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中找到其他控件,但它总是为空。 我做错了什么或这是一个错误?

2 个答案:

答案 0 :(得分:6)

警告:您不应在任何代码中使用FindByName<>。而你正在尝试做的事情将使用Binding来完成。但无论如何我还是要回答。

myEntry是ListView单元格模板的一部分。尝试查找lv.FindByName<Entry>("myEntry")会返回null,因为另一个替代方法是返回所有单元格的所有myEntry

为什么会返回null?因为你的NameScope不同。 Xaml解析器在文件中为每个Xaml根对象创建一个NameScope,然后为DataTemplates创建不同的NameScope。

如果您想要关注活动单元格的myEntry。您必须找到所选的单元格,然后在单元格上使用FindByName。

但是,在一个模板化的控制中,没有简单的方法来获得实际细胞的钩子。这就是为什么我带着警告开始这个答案的原因。再读一遍。

答案 1 :(得分:0)

如果确实没有别的办法,你可以用反射遍历视觉树。 我前段时间已在this question中描述了这种方式。

基本上,您只需调整代码即可使用您的布局。幸运的是,每个单元格只有一个条目视图,所以一旦你得到一个入口对象,你只需要检查它是否是你正在寻找的机器人。