我在WPF中练习数据绑定。
我有Song Class的Song.cs文件。值不会改变,因此无需添加INotifyPropertyChanged。
class Song
{
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
private string artist;
public string Artist
{
get { return artist; }
set { artist = value; }
}
private string album;
public string Album
{
get { return album; }
set { album = value; }
}
public static Song Load(string record)
{
var split = record.Split(';');
Song song = new Song();
song.Artist = split[0];
song.Album = split[1];
song.Title = split[2];
return song;
}
public override string ToString()
{
return String.Format("{0} / {1} / {2}", artist, album, title);
}
}
然后我有SongList.cs,它包含加载一些初始歌曲的方法,这个类派生自ObservableColection。
class SongList : ObservableCollection<Song>
{
public static SongList Load()
{
SongList result = new SongList();
Song s1 = Song.Load("The Offspring;The Americana;Staring At The Sun");
result.Add(s1);
Song s2 = Song.Load("Metallica;Reload;Unforgiven II");
result.Add(s2);
return result;
}
}
数据绑定到XAML中的Listbox
<ListBox Name="listBox" ItemsSource="{Binding}" />
然后在MainWindow构造函数中我将datacontext设置为加载歌曲列表
public MainWindow()
{
InitializeComponent();
SongList songs = SongList.Load();
Song newSong = Song.Load("AC/DC;Back In Black;Hells Bells");
songs.Add(newSong);
listBox.DataContext = songs;
}
这是我的问题。我想在每次单击按钮时将Song添加到SongList,但我不知道如何从ButtonClick事件处理程序访问此列表。
private void Button1_Click(object sender, RoutedEventArgs e)
{
//?
}
答案 0 :(得分:2)
由于您正在练习WPF,我认为您应该开始实施您的应用程序,应用MVVM pattern。您可以在this question中找到一些有用的资源。
无论如何,为了简单起见,你应该有这样的事情:
public class MainWindow
{
SongsList songs;
public MainWindow()
{
InitializeComponent();
songs = new SongList();
listBox.DataContext = songs;
}
public void Button_Click(object sender, EventArgs e)
{
songs = SongList.Load();
Song newSong = Song.Load("AC/DC;Back In Black;Hells Bells");
songs.Add(newSong);
listbox.Items.Refresh();
}
}
应用MVVM模式,为您的应用程序创建相关ViewModel
并将歌曲列表公开为ViewModel
的属性绑定到ItemsSource
的{{1}}属性,不需要调用ListBox
,因为您将在ViewModel中实现INotifyPropertyChanged接口。
答案 1 :(得分:1)
当你说
Song newSong = Song.Load("AC/DC;Back In Black;Hells Bells");
您正在使newSong
成为本地变量。您需要将它作为类级别成员变量才能使其可访问。因此,请在MainWindow
之外声明,然后在Button_Click
中修改它。
我希望你们将它们都放在同一个XAML文件的代码中。