【发布时间】:2021-04-22 22:27:32
【问题描述】:
以下是您需要了解的信息:
这是针对我正在为音乐应用程序编写的 WPF 应用程序。我有一个名为 Song 的类(n.b. 我使用 Protobuff.net 进行序列化和来自 z440.atl.core 的 ATL.Track):
[ProtoContract]
public class Song : IEquatable<Song>, IComparable<Song>
{
[ProtoMember(1)]
private string mFilePath;
private BitmapImage mArtwork;
public BitmapImage Artwork
{
get => mArtwork;
set => mArtwork = value;
}
public Song(Track track)
{
Title = string.IsNullOrEmpty(track.Title) ? string.Empty : track.Title;
ArtistName = string.IsNullOrEmpty(track.Artist) ? string.Empty : track.Artist;
AlbumTitle = string.IsNullOrEmpty(track.Album) ? string.Empty : track.Album;
AlbumArtist = string.IsNullOrEmpty(track.AlbumArtist) ? string.Empty : track.AlbumArtist;
Composer = string.IsNullOrEmpty(track.Composer) ? string.Empty : track.Composer;
Genre = string.IsNullOrEmpty(track.Genre) ? string.Empty : track.Genre;
Year = track.Year == 0 ? null : (int?)track.Year;
TrackNumber = track.TrackNumber == 0 ? null : (int?)track.TrackNumber;
Duration = TimeSpan.FromMilliseconds(track.DurationMs);
DiscNumber = track.DiscNumber == 0 ? null : (int?)track.DiscNumber;
FilePath = track.Path;
Comments = string.Empty;
//This is very costly !
Artwork = BitmapHelper.LoadImage(track.EmbeddedPictures.FirstOrDefault()?.PictureData);
}
public Song()
{
}
[ProtoMember(3)]
public string ArtistName { get; set; }
[ProtoMember(4)]
public string AlbumTitle { get; set; }
[ProtoMember(5)]
public string Title { get; set; }
public Artist Artist { get; set; }
[ProtoMember(7)]
public string AlbumArtist { get; set; }
public Album Album { get; set; }
[ProtoMember(9)]
public string Composer { get; set; }
[ProtoMember(10)]
public string Genre { get; set; }
[ProtoMember(11)]
public int? Year { get; set; }
[ProtoMember(12)]
public int? TrackNumber { get; set; }
[ProtoMember(13)]
public int? DiscNumber { get; set; }
[ProtoMember(14)]
public int? PlayCount { get; set; }
[ProtoMember(15)]
public string Comments { get; set; }
[ProtoMember(17)]
public TimeSpan Duration { get; set; }
public string DisplayDuration => Duration.Days != 0 ? Duration.ToString("dd\\:hh\\:mm\\:ss") : Duration.ToString(Duration.Hours != 0 ? "hh\\:mm\\:ss" : "mm\\:ss");
public string FilePath
{
get => string.IsNullOrEmpty(mFilePath) ? string.Empty : mFilePath;
set => mFilePath = value;
}
public int CompareTo(Song other)
{
return string.Compare(FilePath, other?.FilePath, StringComparison.Ordinal);
}
public override int GetHashCode() => FilePath?.GetHashCode() ?? base.GetHashCode();
public bool Equals([AllowNull] Song other) => other?.FilePath == FilePath;
}
我的 viewModel,我有一个名为 SongList 的 ObservableCollection<Song>,它绑定到我的 View 中的 ListView:
<ListView ItemsSource="{Binding SongList}" SelectedItem="{Binding SelectedSong}" SelectedIndex="{Binding SelectedIndex}">
</ListView>
SongList 在任何给定点都可能太大而无法显示集合中的每首歌曲。有没有办法告诉用户当前正在向用户显示此 ListView 中的哪些歌曲?
【问题讨论】:
-
您能说得更具体些吗?我会给你做个样品。
-
我提供了更多细节。我希望这没问题。
-
这是同一个问题you posted yesterday,由于缺乏明确性而被关闭。删除并重新发布问题以绕过关闭是违反堆栈溢出规则的;你需要edit the original question 来改进它,并等待社区同意它应该重新开放。
-
对不起,我没有意识到这一点。我删除了这个问题正是因为我认为我需要完全改写它。我认为无论如何这是一个稍微不同的问题,最后一个有太多无用的信息。
-
通过列表框或列表视图,它们可以虚拟化。如果您将数据和模板绑定到 ui 中,那么模板化的任何内容都在视图中。任何没有被模板化的东西都不在视图中。使用转换器构建您的图片。使用它进行绑定,它只会被用户看到的图片调用。
标签: c# wpf observable