2016-01-06 2 views
1

Я использую ListView, и в каждой ячейке у меня есть метка и запись справа. Когда я нажимаю на поле ввода, клавиатура будет отображаться, но если я нажму на строку, не нажимая на поле ввода, клавиатура не будет. Как я могу заставить запись сфокусироваться при выборе ее строки?Xamarin Forms Listview set focus to entry в выбранной строке

<?xml version="1.0" encoding="UTF-8"?> 
 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
 
\t xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
 
\t x:Class="Sample7.StartPage"> 
 

 

 
\t <ContentPage.ToolbarItems> 
 
\t \t <ToolbarItem Text="Scanner" Icon="camera.png"> 
 
\t \t </ToolbarItem> 
 

 
\t \t <ToolbarItem Text="Notes" Icon="notes.png" > 
 
\t \t </ToolbarItem> 
 
\t </ContentPage.ToolbarItems> 
 

 

 
\t <ScrollView> 
 
\t \t <StackLayout Padding="20,20,20,0"> 
 
\t \t \t \t <Picker Title="Location" HorizontalOptions="FillAndExpand" Items="NuseedDataManager.getWarehouses()"/> 
 

 
\t \t \t \t <StackLayout Orientation="Horizontal" Padding="0,20,0,20"> 
 
\t \t \t \t \t <Label Text="Show All" HorizontalOptions="FillAndExpand" /> 
 
\t \t \t \t \t <Switch IsToggled="true" HeightRequest="50" WidthRequest="250"/> 
 
\t \t \t \t </StackLayout> 
 

 
\t \t \t \t <ListView x:Name="SkuListView" RowHeight="60"> 
 
\t \t \t \t \t <ListView.ItemTemplate> 
 
\t \t \t \t \t \t <DataTemplate> 
 
\t \t \t \t \t \t \t <ViewCell> 
 

 
\t \t \t \t \t \t \t \t <StackLayout Orientation="Horizontal" BackgroundColor="{Binding BackgroundColor}"> 
 
\t \t \t \t \t \t \t \t \t <Label Text="TITLE\nawesome1awesome1awesome1awesome1awesome1awesome1awesome1awesome1awesome1awesome1awesome1awesome1" HorizontalOptions="FillAndExpand" FontSize="12"/> 
 
\t \t \t \t \t \t \t \t \t <Entry Text="{Binding CountText}" WidthRequest="70" Keyboard="Numeric" IsFocused="{Binding IsEntryFocused}" /> 
 
\t \t \t \t \t \t \t \t </StackLayout> 
 

 
\t \t \t \t \t \t \t </ViewCell> 
 
\t \t \t \t \t \t </DataTemplate> 
 
\t \t \t \t \t </ListView.ItemTemplate> 
 
\t \t \t \t </ListView> 
 

 
\t \t \t \t <StackLayout Padding="0,20,0,20"> 
 
\t \t \t \t \t <Button Text="Verify" /> 
 
\t \t \t \t </StackLayout> 
 
\t \t </StackLayout> 
 
\t </ScrollView> 
 

 

 
</ContentPage>

namespace Sample7 
 
{ 
 
\t public partial class StartPage : ContentPage 
 
\t { 
 
\t \t ObservableCollection<Cell> skus ; 
 
\t \t public StartPage() 
 
\t \t { 
 
\t \t \t InitializeComponent(); 
 

 
\t \t \t skus = new ObservableCollection<Cell>(); 
 

 

 
\t \t \t for (int i = 0; i < 30; i++) { 
 

 
\t \t \t \t if (i < 10) { 
 
\t \t \t \t \t skus.Add(new Cell(){ 
 
\t \t \t \t \t \t BackgroundColor = Color.Aqua, 
 
\t \t \t \t \t \t CountText = "1" 
 
\t \t \t \t \t }); 
 
\t \t \t \t } else { 
 

 
\t \t \t \t \t skus.Add (new Cell() { 
 
\t \t \t \t \t \t BackgroundColor = Color.Red, 
 
\t \t \t \t \t \t CountText = "1" 
 
\t \t \t \t \t }); 
 

 
\t \t \t \t } 
 
\t \t \t } 
 

 
\t \t \t SkuListView.ItemsSource = skus; 
 

 
\t \t \t SkuListView.HeightRequest = SkuListView.RowHeight* skus.Count()+40; 
 

 
\t \t \t SkuListView.ItemSelected += (sender, e) => { 
 
\t \t \t \t Cell c = (Cell)e.SelectedItem; 
 

 
\t \t \t \t c.IsEntryFocused = true; 
 
\t \t \t \t c.BackgroundColor = Color.Olive; 
 
\t \t \t \t c.CountText = "45"; 
 

 
\t \t \t }; 
 
\t \t } 
 
\t } 
 
}

ответ

-1

Вам нужно вызвать метод Focus() из Введения.

+0

где? как? Можете привести пример, пожалуйста. –

+0

В вашем методе ItemSelected. – Jason

0

Создайте новое поведение для записи и установите его BindingContext в экземпляр ListView. Если выбранная строка изменяется (событие ItemSelected), сравните выбранный элемент с элементом текущей строки (entry.BindingContext). В случае матча сосредоточьте запись.

<Entry Text="{Binding CountText}" WidthRequest="70" Keyboard="Numeric"> 
    <Entry.Behaviors> 
     <local:FocusEntryFromSelectedRowBehavior BindingContext="{x:Reference SkuListView}" /> 
    </Entry.Behaviors> 
</Entry> 

public class FocusEntryFromSelectedRowBehavior : Behavior<Entry> 
{ 
    public Entry AssociatedEntry{ get; private set; } 

    protected override void OnAttachedTo(Entry entry) 
    { 
     base.OnAttachedTo(entry); 
     AssociatedEntry = entry;    
     ((ListView)BindingContext).ItemSelected += MyView_ItemSelected;   
    } 

    private void MyView_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
    {    
     if (AssociatedEntry.BindingContext == e.SelectedItem) 
     { 
      AssociatedEntry.Focus(); 
     } 
    } 

    protected override void OnDetachingFrom(Entry entry) 
    {    
     ((ListView)BindingContext).ItemSelected -= MyView_ItemSelected; 
     base.OnDetachingFrom(entry); 
    } 
} 
Смежные вопросы