如何访问后面代码中的元素,该元素在Xamarin.Foms的xaml页面中的DataTemplate中声明?

时间:2019-04-02 06:10:13

标签: c# xaml xamarin.forms

我试图通过单击按钮访问实际上在ListView的ItemTemplate中的DataTemplate中声明的Entry。

<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(),但实际上并没有显示运行时的变化。

有人可以帮我这个忙吗?简而言之,我需要通过单击按钮访问现有条目实例(在DataTemplate中声明)的文本。

3 个答案:

答案 0 :(得分:4)

您可以使用数据绑定来设置和获取条目的文本。

  

在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; }
}

在contentPage中

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

答案 1 :(得分:0)

我认为,您必须选择另一种方法。

为什么您在Binding中的Entry中不使用ListView?如果您是Xamarin的新手,我建议您阅读MVVM模式:link to MVVM

您可以在EntryText类中添加类似Customer的参数,并从ViewModel中获取值,在其中创建绑定的参数。

答案 2 :(得分:-1)

更好的方法是将视图模型与数据绑定一起使用。

但是,如果您必须引用控制元素本身,则可以这样做 (项目来源必须在集合中至少有一项,例如在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");
}