积极答复者
关于listbox数据绑定的问题

问题
-
程序流程如下:
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()));
}
}}
请高手指点,万分感谢。
答案
-
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>
全部回复
-
你不应该用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()));}
-
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>