如何以编程方式将多个字符串添加到多列ListView中的一行



所以我是WPF的新手,因为我更熟悉WinForms,但为了绘图性能和好看的UI,我切换到了WPF,我没有XAML的经验,但我正在解决我的问题。

我有一个ListView,它可以作为我的媒体播放器应用程序的播放列表。在WinForms中,在多列的一行中添加多个数据不是问题,我只需要添加一个ListViewItem并填充它的SubItems,但在WPF中,这是一个问题,ListViewItem既没有SubItems属性,也没有ListView,我尝试了Stack Overflow和其他网站的多个问题,但对我没有帮助,这都是关于DisplayMemberBinding的,但我仍然不知道如何在代码中引用它。

ListView:的XAML

<ListView x:Name="Playlist_Main" Margin="0" ItemsSource="{Binding SourceCollection}">
<ListView.View>
<GridView>
<GridViewColumn Header="#" DisplayMemberBinding="{Binding Num}"/>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}"/>
<GridViewColumn Header="Artist" DisplayMemberBinding="{Binding Artist}"/>
<GridViewColumn Header="Album" DisplayMemberBinding="{Binding Album}"/>
<GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}"/>
<GridViewColumn Header="Track Num" DisplayMemberBinding="{Binding Track}"/>
</GridView>
</ListView.View>
</ListView>

主代码

Playlist_Main.Items.Add(New ListViewItem({Playlist_Main.Items.Count + 1, Info(0), Info(1), Info(2), Info(3), Info(4)}))

ListView/GridView中的绑定需要一个公开NumTitle等属性的项类型。您必须公开该项类型的集合,并将其分配或绑定到ItemsSource属性。

为播放列表中的项目创建模型。以下示例实现了INotifyPropertyChanged接口,该接口使绑定能够在属性值发生更改时通过PropertyChanged事件进行更新。如果你的属性是只读的,或者你不需要在运行时更新值,你就不必实现它

public class PlaylistItem : INotifyPropertyChanged
{
private int _num;
private string _title;
private string _artist;
private string _album;
private int _year;
private int _track;
public PlaylistItem(int num, string title, string artist, string album, int year, int track)
{
Num = num;
Title = title;
Artist = artist;
Album = album;
Year = year;
Track = track;
}
public int Num
{
get => _num;
set
{
if (_num == value)
return;
_num = value;
OnPropertyChanged();
}
}
public string Title
{
get => _title;
set
{
if (_title == value)
return;
_title = value;
OnPropertyChanged();
}
}
public string Artist
{
get => _artist;
set
{
if (_artist == value)
return;
_artist = value;
OnPropertyChanged();
}
}
public string Album
{
get => _album;
set
{
if (_album == value)
return;
_album = value;
OnPropertyChanged();
}
}
public int Year
{
get => _year;
set
{
if (_year == value)
return;
_year = value;
OnPropertyChanged();
}
}
public int Track
{
get => _track;
set
{
if (_track == value)
return;
_track = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

在代码隐藏方法中,您可以创建PlaylistItems的集合。如果您希望在用户界面中反映对集合的更改,例如添加或删除项,请使用实现INotifyCollectionChanged接口的ObservableCollection<T>ObservableCollection<T>通过CollectionChanged事件自动执行此操作。如果在运行时未修改列表,则可以使用任何其他集合。

var playlistItems = new ObservableCollection<PlaylistItem>();
playlistItems.Add(new PlaylistItem(1, "Enter Sandman", "Metallica", "Metallica", 1991, 1));
// ...add other playlist items.

您可以将此集合直接分配给ListView,例如在构造函数中。

public MainWindow()
{
var playlistItems = // ...create the items collection or load them from somewhere.
Playlist_Main.ItemsSource = playlistItems;
}

另一种方法是在代码背后创建一个公共属性。我想是MainWindow

public partial class MainWindow
{
public MainWindow()
{
PlaylistItems = // ...create the items collection or load them from somewhere.
}
public ObservableCollection<PlaylistItem> PlaylistItems { get; }
}

您可以在XAML中使用RelativeSource绑定到窗口来绑定此集合。

<ListView ItemsSource="{Binding Tracks, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}">

正如您所看到的,有多种方法,甚至更多。在我看来,最好的办法是使用MVVM模式。为此,您需要为包含集合的主窗口创建一个视图模型。

public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
PlaylistItems = // ...create the items collection or load them from somewhere.
}
public ObservableCollection<PlaylistItem> PlaylistItems { get; }
// ...other properties and methods.
}

接下来,您将此视图模型的一个实例设置为窗口的DataContext

<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>

然后您可以像这样绑定到集合。数据上下文(MainViewModel(是自动继承的。

<ListView ItemsSource="{Binding PlaylistItems}">

此模式可帮助您将用户界面与数据和业务逻辑分离。正如您所看到的,没有从视图模型到视图的引用,只有公开可以绑定的数据的属性。

更多学习资源:

  • WPF中的数据绑定概述
  • 如何:创建并绑定到ObservableCollection

最新更新