-3

リストボックス項目からコンポーネントを取得する必要があります。タップまたは選択変更イベントからではありません。これを達成する簡単な方法はありますか?私の記憶が正しければ、Android では次のように書くことができます。

layoutRoot.findViewById(R.id.name);

Windows Phone でこれを行う同様の方法はありますか?


更新:これまでに試したことは次のとおりですが、機能しません:

オプション 5 でダニエラが言ったことは、ListBoxItem がある場合に機能するようです。したがって、たとえば 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は私たちが作成したクラスであり、ItemViewModelsのリストがリストボックスの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 に答える