如何从背后的代码访问ListBox动态创建的项目的属性? [英] How to access ListBox dynamically-created-items' properties from code-behind?

查看:48
本文介绍了如何从背后的代码访问ListBox动态创建的项目的属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XAML:

<Window x:Class="WpfApp_ListBoxTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
  <ListBox Name="lb" Margin="0,0,0,70"></ListBox>
  <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,41" Name="btnAdd" VerticalAlignment="Bottom" Content="Add item" Width="75" Click="btnAdd_Click"></Button>
  <TextBox Height="23" Margin="93,0,12,41" Name="txtInput" VerticalAlignment="Bottom" />
  <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,12" Name="btnGet" VerticalAlignment="Bottom" Content="Get value" Width="75" Click="btnGet_Click"></Button>
  <TextBox Height="23" Margin="93,0,12,12" Name="txtReturn" VerticalAlignment="Bottom" IsReadOnly="True" />
 </Grid>
</Window>

锐化:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace WpfApp_ListBoxTest
{
 /// <summary>
 /// Interaction logic for Window1.xaml
 /// </summary>
 public partial class Window1 : Window
 {
  public Window1()
  {
   InitializeComponent();
  }

  private void btnAdd_Click(object sender, RoutedEventArgs e)
  {
   TextBox txt = new TextBox();
   txt.Width = 200;
   txt.Text = txtInput.Text;
   lb.Items.Add(txt);
  }

  private void btnGet_Click(object sender, RoutedEventArgs e)
  {
   // What do I need to write here to get the value of the Text property of the selected TextBox?

  }
 }
}

和屏幕截图:(对不起,我不允许直接发布图片) http://i825.photobucket.com/albums/zz180/mGlushed/get_listbox_item_property. png

And screenshot: (Sorry I'm not allowed to post picture directly) http://i825.photobucket.com/albums/zz180/mGlushed/get_listbox_item_property.png

(在上图中,当我单击获取值"按钮时,我想获取值"b".)

(In the picture above, I want to get the value "b" when I click the "Get value" button.)

我想知道是否有一种简单的方法来实现这一目标.

I would like to know if there is a simple way to achieve this.

我是WPF的新手,所以我只知道很长一段时间才能做到这一点,即:创建一个数组.每次创建新的TextBox时,请将其添加到数组中.然后通过数组访问TextBox.但这听起来并不是很理想.

I'm new to WPF, so I only know to do this the long way, which is: Create an array. Everytime a new TextBox is created, add it into the array. Then access the TextBox'es through the array. But that doesn't sound very optimal, I think.

推荐答案

要做的"WPF方法"是使用数据绑定:

The 'WPF Way' of doing what you want is to use data binding:

  1. 使用名为Text的字符串属性定义一个类.
  2. 创建该类的集合.
  3. 将列表框ItemsSource绑定到集合中.
  4. 创建一个数据模板,以显示使用{Binding Path = Text}绑定了其Text属性的TextBox.
  5. 在btnAdd_Click中将一个项目添加到集合中(而不是直接添加到列表框中)
  6. 在btnGet_Click中,您可以通过将ListBox.SelectedItem强制转换为类并获取其Text属性来获取输入的文本.

示例:

简单的类:

public class VMObject
{
    public VMObject(string text)
    {
        Text = text;
    }

    public string Text { get; set; }
}

背后的窗口代码:

public partial class Window1 : Window
{
    public ObservableCollection<VMObject> VM { get; set; }

    public Window1()
    {
        VM = new ObservableCollection<VMObject>();
        InitializeComponent();
    }

    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {
        VM.Add(new VMObject(txtInput.Text));
    }

    private void btnGet_Click(object sender, RoutedEventArgs e)
    {
        if (lb.SelectedItem == null)
            MessageBox.Show("No item is selected!");
        txtReturn.Text = ((VMObject)lb.SelectedItem).Text;
    }
}

XAML:

<Window x:Class="lbtest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Name="Window"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="TextBoxTemplate">
            <TextBox Text="{Binding Path=Text}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox Name="lb" Margin="0,0,0,70"
                 ItemsSource="{Binding ElementName=Window, Path=VM}"
                 ItemTemplate="{StaticResource TextBoxTemplate}" />
        <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,41"
                Name="btnAdd" VerticalAlignment="Bottom"
                Content="Add item" Width="75" Click="btnAdd_Click" />
        <TextBox Height="23" Margin="93,0,12,41"
                 Name="txtInput" VerticalAlignment="Bottom" />
        <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,12"
                Name="btnGet" VerticalAlignment="Bottom"
                Content="Get value" Width="75" Click="btnGet_Click" />
        <TextBox Height="23" Margin="93,0,12,12"
                 Name="txtReturn" VerticalAlignment="Bottom" IsReadOnly="True" />
    </Grid>
</Window>

这篇关于如何从背后的代码访问ListBox动态创建的项目的属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆