-3

我需要从列表框项中检索组件。不是来自点击或选择更改的事件。有没有一种简单的方法可以实现这一目标?如果我没记错的话,在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

4

3 回答 3

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。

这是我为您制作的应用示例

有几种方法可以做到这一点(一些示例是 WPF,但代码非常相似,这只是为了给您一个大致的想法)

  1. 在代码中创建列表框并检索项目,如我的 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;
    }
    
  2. 在更改的事件(或绑定到列表框的其他事件)上检索选定的项目

        void ItemView_ItemClick(object sender, ItemClickEventArgs e)
    {
        var itemProperty = ((ListBoxItem) e.ClickedItem).SomeProperty;
    }
    
  3. 为列表框提供名称并通过引用代码中的名称来访问项目

    var item = itemListView.SelectedItem as SomeClass;

  4. 通过绑定到另一个元素来访问所选项目(仅限 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>
    

  5. 搜索 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();
    }
于 2012-06-30T20:10:26.077 回答
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;
}
于 2014-09-08T18:25:21.813 回答
0
ListBox x = new ListBox();
ListBoxItem item = x.Items[0];

还是你想要别的东西?

于 2012-06-30T19:47:24.827 回答