将Observable集合绑定到ListView
本文关键字:ListView 绑定 集合 Observable | 更新日期: 2023-09-27 17:53:56
XAML:
<Window x:Class="Genesis.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="725" Width="918" Loaded="Window_Loaded"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<ListView Margin="22,39,0,0" Name="Library" DataContext="{Binding}" ItemsSource="{Binding _songData}" HorizontalAlignment="Left" Width="854" Height="427" VerticalAlignment="Top">
<ListView.View>
<GridView x:Name="gvLibrary" >
<GridViewColumn Width="220" Header="Title" DisplayMemberBinding="{Binding Title}" x:Name="gvColumnTitle" />
<GridViewColumn Width="180" Header="Artist" DisplayMemberBinding="{Binding Artist}" x:Name="gvColumnArtist" />
<GridViewColumn Width="180" Header="Album" DisplayMemberBinding="{Binding Album}" x:Name="gvColumnAlbum" />
<GridViewColumn Width="180" Header="Location" DisplayMemberBinding="{Binding Location}" x:Name="gvColumnLocation" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
C#:
ObservableCollection<songInfo> songData = new ObservableCollection<songInfo>();
public ObservableCollection<songInfo> _songData
{
get
{
return songData;
}
}
public ObservableCollection<songInfo> getStoredData()
{
string[] songs = System.IO.File.ReadAllLines("library");
ObservableCollection<songInfo> songs_formatted = new ObservableCollection<songInfo>();
foreach (string song in songs)
{
string[] data = song.Split('|');
songs_formatted.Add(new songInfo
{
Title = data[0],
Artist = data[1],
Album = data[2],
Location = data[3]
});
}
return songs_formatted;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (System.IO.File.Exists("library"))
{
songData = getStoredData();
}
else
{
F.MessageBox.Show("Could not get your Library.");
}
F.MessageBox.Show(songData.ToArray().Length.ToString());
}
public class songInfo
{
public string Title { get; set; }
public string Artist { get; set; }
public string Album { get; set; }
public string Location { get; set; }
}
ObservableCollection
在运行时被正确填充,并且所有元素都被正确格式化:问题与将集合绑定到listview和列有关。
问题是您正在设置songData
,但ListView绑定到_songData
,ListView不会知道您更改了songData
。
尝试向_songData
添加一个setter,并将getStoredData();
设置为该setter。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (System.IO.File.Exists("library"))
{
_songData = getStoredData();
}
}
private ObservableCollection<songInfo> songData = new ObservableCollection<songInfo>();
public ObservableCollection<songInfo> _songData
{
get { return songData; }
set { songData = value; }
}