将成员添加到WPF中的绑定列表

时间:2013-11-19 10:43:05

标签: c# wpf xaml data-binding

我在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)
{
    //?
}

2 个答案:

答案 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文件的代码中。