我需要从列表框项中检索组件。不是来自Tap或选择更改的事件。有没有一种简单的方法来实现这一目标? 如果我没记错的话,在Android中你可以写:
layoutRoot.findViewById(R.id.name);
在Windows Phone上有类似的方法吗?
更新:这是我到目前为止所尝试的内容,但不起作用:
当我拥有ListBoxItem时,Daniela在选项5中所说的内容似乎有效。因此,当我在ListBoxItem上有一个Tap事件时,这个工作正常:
private void ListBoxItem_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
ListBoxItem item = sender as ListBoxItem;
// I can now retrieve a component inside the ListBoxItem
TextBox textBox = item.FindName("myTextBox") as TextBox;
}
但是我想在不触发ListBoxItem中的任何事件时这样做。 JoonasL所说的看起来像是我可以使用的东西,但我无法让它发挥作用。
// will not compile ( Cannot implicitly convert type 'object' to... )
ListBoxItem item = x.Items[0];
// if cast the value will be null
ListBoxItem item = x.Items[0] as ListBoxItem;
// will return the object used to populate that ListBoxItem, not the actual ListBoxItem.
// item will have a ItemViewModel object.
List<ItemViewModel> list = ....
this.myListBox.ItemsSource = list;
var item = x.Items[0]
在Google上搜索时,我发现了一些可以用来在ListBoxItem中查找组件的内容,但我认为应该有一种更简单的方法。他们在这里使用VisualTreeHelper。
答案 0 :(得分:3)
编辑: 为你的lisbox添加一个名字(x:Name =“something”) 将所有项目转换为列表或选择项目并将项目转换为正确的类型。例如:
private void Button_Click(object sender, RoutedEventArgs e)
{
var list = yourListbox.Items;
var itemCastAsCorrectObjectInstance = (ItemViewModel)list.FirstOrDefault();
textblock.Text = itemCastAsCorrectObjectInstance.LineOne;
}
ItemViewModel是我们创建的一个类,ItemViewModel列表用作列表框的itemssource。
Here is an app example I've made for you
有几种方法可以做到这一点(有些例子是WPF,但代码非常相似,只是为了给你一个大概的想法)
在代码中创建列表框并检索项目,如我的JoonasL提供的示例
private void GetUserRecommendations()
{
var obj = _helper.GetList<Recommendations>(@"http://localhost:1613/Home/GetAllRecommendations");
_items.Clear();
foreach (var item in obj)
{
_items.Add(item);
}
itemListView.ItemsSource = _items;
}
检索已更改事件(或绑定到列表框的其他事件)上的选定项目
void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
var itemProperty = ((ListBoxItem) e.ClickedItem).SomeProperty;
}
为列表框提供名称,并通过引用代码中的名称
来访问这些项目var item = itemListView.SelectedItem as SomeClass;
通过绑定到另一个元素(仅限XAML)
来访问所选项目<Border Margin="10" BorderBrush="Silver" BorderThickness="3" Padding="8">
<DockPanel>
<TextBlock>Choose a Color:</TextBlock>
<ComboBox Name="myComboBox" SelectedIndex="0">
<ComboBoxItem>Green</ComboBoxItem>
<ComboBoxItem>Blue</ComboBoxItem>
<ComboBoxItem>Red</ComboBoxItem>
</ComboBox>
<Canvas>
<Canvas.Background>
<Binding ElementName="myComboBox" Path="SelectedItem.Content"/>
</Canvas.Background>
</Canvas>
</DockPanel>
搜索layoutroot
var myTextBlock =(TextBlock)this.FindName(“myTextBlock”);
或者类似的东西:
private void Somepage_Loaded(object sender, RoutedEventArgs e)
{
if (SomeCondition())
{
var children = (sender as Panel).Children;
var child = (from Control child in children
where child.Name == "NameTextBox"
select child).First();
child.Focus();
}
答案 1 :(得分:0)
ListBox x = new ListBox();
ListBoxItem item = x.Items[0];
或者你想要别的吗?
答案 2 :(得分:0)
RadDataBoundListBox有一个名为ItemTap的事件(不确定正常的ListBox)但我的解决方案是这样的:
private void FocusTextBox(object sender, ListBoxItemTapEventArgs e)
{
txtBox = e.Item.FindChildByType<TextBox>();
var item = itemListView.SelectedItem as PanoramaApp1.//Your Selected Item Type Here;
//Do Something With item Here
itemListView.SelectedItem = null;
}