我试图通过单击按钮访问实际上在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中声明)的文本。
答案 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");
}
}
答案 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");
}