none
关于listbox数据绑定的问题 RRS feed

  • 问题

  • 程序流程如下:

     

    1、在"name" textbox中输入Name,在"nick" textbox中输入Nickname,单击"Add" Button,组合name和nickname添加到listbox中。

     

    2、选中listbox的某一项,Name值和Nickname值分别显示在两个textbox中,修改textbox中的字符,当焦点离开textbox时,listbox中的相应项更新。

     

    问题如下:

     

    1、添加listbox项时,textbox中的数据传递不到listbox中。

    2、修改listbox某项数据时,后台对象(数据源)的值发生变化,但是listbox中item的值不变。

     

    程序是《Programming Windows Presentation Foundation》关于数据绑定的例子:

     

    XAML文件代码如下:

    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="NameWindow" Height="300" Width="300" >
        <DockPanel x:Name="dockPanel" >
            <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
                <TextBlock VerticalAlignment="Center">Name:</TextBlock>
                <TextBox Width="100" Text="{Binding Path=Name}"  />
                <TextBlock VerticalAlignment="Center">Nick:</TextBlock>
                <TextBox Text="{Binding Path=Nick}" Width="100" />
            </StackPanel>
            <Button DockPanel.Dock="Bottom" x:Name="addButton">Add</Button>
            <ListBox x:Name="listbox1" ItemsSource="{Binding}"  IsSynchronizedWithCurrentItem="True" />
        </DockPanel>
    </Window>

     

    cs文件如下:

    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.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Collections.Specialized;
    using System.Data.Common;

    namespace WpfApplication1
    {
        public class Nickname : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propName));
                }
            }
            private string name;

            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    name = value;
                    OnPropertyChanged(Name);
                }
            }
            private string nick;

            public string Nick
            {
                get
                {
                    return nick;
                }
                set
                {
                    nick = value;
                    OnPropertyChanged(Nick);
                }
            }

            public Nickname() : this("name", "nick") { }
            public Nickname(string name, string nick)
            {
                this.name = name;
                this.nick = nick;
            }

            public override string ToString()
            {
                return String.Format("{0},{1}",name,nick);
            }
        }

        public class Nicknames : ObservableCollection<Nickname> {}
        public partial class Window1 : Window
        {
            Nicknames names;
            public Window1()
            {
                InitializeComponent();
                this.addButton.Click += addButton_Click;
                this.names = new Nicknames();

                dockPanel.DataContext = this.names;
            }

            void addButton_Click(object sender, RoutedEventArgs e)
            {
                this.names.Add(new Nickname());
                MessageBox.Show(string.Format("1.{0}\n",this.names[0].ToString()));
               
            }
        }

    }

     

    请高手指点,万分感谢。

     

    2008年12月31日 7:17

答案

  • 1、在你这个例子里数据使用绑定,就是为了在修改数据的时候,所有与之相关的数据都同时进行修改。初始化数据与你构造函数有关。

    2、在修改数据的时候,你的listbox的数据项也必须绑定到两个textbox绑定值。你可以使用

    使用 DataTemplate 指定数据对象的可视化。在默认情况下,ListBox 将在集合中显示对象的字符串表示形式,现在在你代码中可以使用 DataTemplate 定义数据对象的外观。

    详细请看http://msdn.microsoft.com/zh-cn/library/system.windows.datatemplate.aspx 

     

    在你的代码,增加下面的代码,你可以试一下:

    <ListBox x:Name="listbox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" >
       <ListBox.ItemTemplate>
        <DataTemplate>
         <DockPanel >
          <TextBlock Text="{Binding Path=Name}" />
          <TextBlock Text="{Binding Path =Nick}" />
         </DockPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
      </ListBox>

    2009年1月4日 3:06

全部回复

  • 你不应该用this.names.Add(new Nickname()); 而应该是 this.names.Add(new Nickname(textBoxName.Text,textBoxNick.Text)); 其中textBoxName和textBoxNick是textBox的名字。

      void addButton_Click(object sender, RoutedEventArgs e)
            {
                this.names.Add(new Nickname(textBoxName.Text,textBoxNick.Text));
                MessageBox.Show(string.Format("1.{0}\n", this.names[0].ToString()));

            }

    2008年12月31日 9:09
  • 谢谢你的回复。这样的话:

    1、不就体现不出Binding了吗?例子中,names collection绑定到两个textbox和一个listbox中。

    2、虽然初始化到listbox中能显示textbox输入的数据,但是修改的时候依然存在问题。

    2008年12月31日 9:33
  • 1、在你这个例子里数据使用绑定,就是为了在修改数据的时候,所有与之相关的数据都同时进行修改。初始化数据与你构造函数有关。

    2、在修改数据的时候,你的listbox的数据项也必须绑定到两个textbox绑定值。你可以使用

    使用 DataTemplate 指定数据对象的可视化。在默认情况下,ListBox 将在集合中显示对象的字符串表示形式,现在在你代码中可以使用 DataTemplate 定义数据对象的外观。

    详细请看http://msdn.microsoft.com/zh-cn/library/system.windows.datatemplate.aspx 

     

    在你的代码,增加下面的代码,你可以试一下:

    <ListBox x:Name="listbox1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" >
       <ListBox.ItemTemplate>
        <DataTemplate>
         <DockPanel >
          <TextBlock Text="{Binding Path=Name}" />
          <TextBlock Text="{Binding Path =Nick}" />
         </DockPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
      </ListBox>

    2009年1月4日 3:06