本文整理汇总了C#中Playlist.CreateDerivedCollection方法的典型用法代码示例。如果您正苦于以下问题:C# Playlist.CreateDerivedCollection方法的具体用法?C# Playlist.CreateDerivedCollection怎么用?C# Playlist.CreateDerivedCollection使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Playlist
的用法示例。
在下文中一共展示了Playlist.CreateDerivedCollection方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PlaylistViewModel
/// <summary>
/// Initializes a new instance of the <see cref="PlaylistViewModel" /> class.
/// </summary>
/// <param name="playlist">The playlist info.</param>
/// <param name="renameRequest">
/// A function that requests the rename of the playlist. Return true, if the rename is
/// granted, otherwise false.
/// </param>
public PlaylistViewModel(Playlist playlist, Func<string, bool> renameRequest)
{
this.playlist = playlist;
this.renameRequest = renameRequest;
this.disposable = new CompositeDisposable();
this.entries = playlist
.CreateDerivedCollection(entry => new PlaylistEntryViewModel(entry))
.DisposeWith(this.disposable);
this.entries.ItemsRemoved.Subscribe(x => x.Dispose());
this.playlist.WhenAnyValue(x => x.CurrentSongIndex).ToUnit()
.Merge(this.entries.Changed.ToUnit())
.Subscribe(_ => this.UpdateCurrentSong())
.DisposeWith(this.disposable);
IObservable<List<PlaylistEntryViewModel>> remainingSongs = this.entries.Changed
.Select(x => Unit.Default)
.Merge(this.playlist.WhenAnyValue(x => x.CurrentSongIndex).ToUnit())
.Select(x => this.entries.Reverse().TakeWhile(entry => !entry.IsPlaying).ToList());
this.songsRemaining = remainingSongs
.Select(x => x.Count)
.ToProperty(this, x => x.SongsRemaining)
.DisposeWith(this.disposable);
this.timeRemaining = remainingSongs
.Select(x => x.Any() ? x.Select(entry => entry.Duration).Aggregate((t1, t2) => t1 + t2) : (TimeSpan?)null)
.ToProperty(this, x => x.TimeRemaining)
.DisposeWith(this.disposable);
this.CurrentPlayingEntry = this.Model.WhenAnyValue(x => x.CurrentSongIndex).Select(x => x == null ? null : this.entries[x.Value]);
}
示例2: PlaylistViewModel
public PlaylistViewModel(Playlist playlist, Library library, Guid accessToken, CoreSettings coreSettings)
{
if (playlist == null)
throw new ArgumentNullException("playlist");
if (library == null)
throw new ArgumentNullException("library");
if (coreSettings == null)
throw new ArgumentNullException("coreSettings");
this.playlist = playlist;
this.library = library;
this.disposable = new CompositeDisposable();
this.entries = playlist
.CreateDerivedCollection(entry => new PlaylistEntryViewModel(entry), x => x.Dispose())
.DisposeWith(this.disposable);
this.playlist.WhenAnyValue(x => x.CurrentSongIndex).ToUnit()
.Merge(this.entries.Changed.ToUnit())
.Subscribe(_ => this.UpdateCurrentSong())
.DisposeWith(this.disposable);
IObservable<List<PlaylistEntryViewModel>> remainingSongs = this.entries.Changed
.Select(x => Unit.Default)
.Merge(this.playlist.WhenAnyValue(x => x.CurrentSongIndex).ToUnit())
.Select(x => this.entries.Reverse().TakeWhile(entry => !entry.IsPlaying).ToList());
this.songsRemaining = remainingSongs
.Select(x => x.Count)
.ToProperty(this, x => x.SongsRemaining)
.DisposeWith(this.disposable);
this.timeRemaining = remainingSongs
.Select(x => x.Any() ? x.Select(entry => entry.Duration).Aggregate((t1, t2) => t1 + t2) : (TimeSpan?)null)
.ToProperty(this, x => x.TimeRemaining)
.DisposeWith(this.disposable);
this.CurrentPlayingEntry = this.Model.WhenAnyValue(x => x.CurrentSongIndex).Select(x => x == null ? null : this.entries[x.Value]);
this.canAlterPlaylist = this.library.LocalAccessControl.HasAccess(coreSettings.WhenAnyValue(x => x.LockPlaylist), accessToken)
.ToProperty(this, x => x.CanAlterPlaylist)
.DisposeWith(disposable);
// We re-evaluate the selected entries after each up or down move here, because WPF
// doesn't send us proper updates about the selection
var reEvaluateSelectedPlaylistEntry = new Subject<Unit>();
this.MovePlaylistSongUpCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.SelectedEntries)
.Merge(reEvaluateSelectedPlaylistEntry.Select(_ => this.SelectedEntries))
.Select(x => x != null && x.Count() == 1 && x.First().Index > 0)
.CombineLatest(this.WhenAnyValue(x => x.CanAlterPlaylist), (canMoveUp, canAlterPlaylist) => canMoveUp && canAlterPlaylist));
this.MovePlaylistSongUpCommand.Subscribe(_ =>
{
int index = this.SelectedEntries.First().Index;
this.library.MovePlaylistSong(index, index - 1, accessToken);
reEvaluateSelectedPlaylistEntry.OnNext(Unit.Default);
});
this.MovePlaylistSongDownCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.SelectedEntries)
.Merge(reEvaluateSelectedPlaylistEntry.Select(_ => this.SelectedEntries))
.Select(x => x != null && x.Count() == 1 && x.First().Index < this.Songs.Count - 1)
.CombineLatest(this.WhenAnyValue(x => x.CanAlterPlaylist), (canMoveDown, canAlterPlaylist) => canMoveDown && canAlterPlaylist));
this.MovePlaylistSongDownCommand.Subscribe(_ =>
{
int index = this.SelectedEntries.First().Index;
this.library.MovePlaylistSong(index, index + 1, accessToken);
reEvaluateSelectedPlaylistEntry.OnNext(Unit.Default);
});
this.MovePlaylistSongCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.SelectedEntries)
.Merge(reEvaluateSelectedPlaylistEntry.Select(_ => this.SelectedEntries))
.Select(x => x != null && x.Count() == 1)
.CombineLatest(this.WhenAnyValue(x => x.CanAlterPlaylist), (canMoveUp, canAlterPlaylist) => canMoveUp && canAlterPlaylist));
this.MovePlaylistSongCommand.Subscribe(x =>
{
int fromIndex = this.SelectedEntries.First().Index;
int toIndex = (int?)x ?? this.Songs.Last().Index + 1;
// If we move a song from the front of the playlist to the back, we want it move be
// in front of the target song
if (fromIndex < toIndex)
{
toIndex--;
}
this.library.MovePlaylistSong(fromIndex, toIndex, accessToken);
reEvaluateSelectedPlaylistEntry.OnNext(Unit.Default);
});
this.RemoveSelectedPlaylistEntriesCommand = ReactiveCommand.Create(this.WhenAnyValue(x => x.SelectedEntries, x => x.CanAlterPlaylist,
(selectedPlaylistEntries, canAlterPlaylist) => selectedPlaylistEntries != null && selectedPlaylistEntries.Any() && canAlterPlaylist));
this.RemoveSelectedPlaylistEntriesCommand.Subscribe(x => this.library.RemoveFromPlaylist(this.SelectedEntries.Select(entry => entry.Index), accessToken));
}