Как получить доступ к элементу кода, который объявлен внутри DataTemplate на странице xaml в Xamarin.Foms? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить доступ к записи, объявленной в DataTemplate, которая фактически находится в ItemTemplate в ListView, с помощью нажатия кнопки.

<StackLayout>

    <Button Text="GetEntryTemplate" Clicked="Button_Clicked"/>

    <ListView x:Name="listView" ItemsSource="{Binding Customer}">

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell>

                    <Entry Text="Xamarin"/>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>

</StackLayout>


    private void Button_Clicked(object sender, EventArgs e)
    {
        var loadedTemplate = listView.ItemTemplate.CreateContent();
        var view = ((loadedTemplate as ViewCell).View as Entry).Text;            
    }

Я пробовал CreateContent (), который на самом деле не показываетизменения времени выполнения.

Может кто-нибудь помочь мне в этом.Короче говоря, мне нужно получить доступ к тексту экземпляра Existing Entry (объявлен внутри DataTemplate) с помощью нажатия кнопки.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2019

Вы можете использовать привязку данных, чтобы установить и получить текст записи.

в xaml

<StackLayout>

    <Button Text="GetEntryTemplate" Clicked="Button_Clicked"/>

    <ListView x:Name="listView">

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell>

                    <Entry TextColor="Black" Text="{Binding Content,Mode=TwoWay}"/>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>

</StackLayout>

в вашем коде позади

создать режим (например, моя модель с именем Data)

public class Data
{
    public string Content { get; set; }
}

А в содержании страницы

public partial class MainPage : ContentPage
{

    public ObservableCollection<Data> MySource { get; set; }

    public MainPage()
    {
        InitializeComponent();

        BindingContext = this;



        MySource = new ObservableCollection<Data>()
        {
          new Data() {Content="Entry_1" },
        };

        listView.ItemsSource = MySource;

    }



    private void Button_Clicked(object sender, EventArgs e)
    {

        DisplayAlert("title", MySource[0].Content, "cancel");

    }
}

enter image description here

0 голосов
/ 02 апреля 2019

Лучше было бы использовать модель представления с привязкой данных.

Но если вам нужно было получить ссылку на сам элемент управления, вы можете сделать это так (источник элементов должен иметь по крайней мере один элемент в коллекции, добавилнапример, явно в xaml):

<Button Text="GetEntryTemplate" Clicked="Button_OnClicked"/>

<ListView x:Name="listView">

    <ListView.ItemsSource>
        <x:Array Type="{x:Type x:String}">
            <x:String>my customer</x:String>
        </x:Array>
    </ListView.ItemsSource>

    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Entry x:Name="cellEntry" Text="Xamarin"/>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>

Код:

private void Button_OnClicked(object sender, EventArgs e)
{
    var cell = listView.TemplatedItems.FirstOrDefault();
    var entry = (Entry)cell.FindByName("cellEntry");
    DisplayAlert("My Entry", entry.Text, "Close");
}
0 голосов
/ 02 апреля 2019

Я думаю, вам нужно выбрать другой подход.

Почему бы вам не использовать Binding для Entry в ListView?Если вы новичок в Xamarin, я бы порекомендовал вам прочитать о шаблоне MVVM: ссылка на MVVM .

Вы можете добавить параметр типа EntryText в свой класс Customer и получить значениеиз вашей ViewModel, где вы создадите связанный параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...