【问题标题】:Determine what is in a user's view in a WPF window确定 WPF 窗口中用户视图中的内容
【发布时间】: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&lt;Song&gt;,它绑定到我的 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


【解决方案1】:

您可能需要稍微改写您的问题并提供示例代码以提供上下文以获得更好的答案。如需参考,请参阅文档页面:https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1

ObservableCollection 本质上是一个集合,它为集合上的各种操作(例如,添加或删除项目)触发通知。由于您已将其标记为 WPF,因此文档中的此评论可能是一个很好的总结:

WPF 提供了ObservableCollection&lt;T&gt; 类,它是实现INotifyCollectionChanged 接口的数据集合的内置实现。

因此,要直接回答您的问题,“观察”集合本身并不一定需要“用户”,它只是一个对象,当它发生变化时会发出通知。不幸的是,如果没有更多上下文,我不能说得更具体了。

编辑:改写和拼写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多