如何在Windows Phone中的列表框项中查找组件?

时间:2012-06-30 12:17:35

标签: c# windows-phone

我需要从列表框项中检索组件。不是来自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

3 个答案:

答案 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,但代码非常相似,只是为了给你一个大概的想法)

  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

  6. 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;
}