/// <summary> /// コンストラクタ /// </summary> /// <param name="youtubeService">YouTubeサービス</param> /// <param name="webClientService">Webクライエントサービス</param> public AddPlaylistItemDialogViewModel(IYouTubeService youtubeService, IWebClientService webClientService) { m_YouTubeService = youtubeService; m_WebClientService = webClientService; SearchWord = new ReactivePropertySlim <string>().AddTo(m_Disposables); SearchResultList = new ReactiveCollection <VideoViewModel>().AddTo(m_Disposables); SelectedItem = new ReactivePropertySlim <VideoViewModel>().AddTo(m_Disposables); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="id">ID</param> /// <param name="title">タイトル</param> /// <param name="description">動画の概要</param> /// <param name="url">URL</param> public SearchResultItemViewModel(string id, string title, string description, string url) { Id = id; Title = title; Description = description; Image = new ReactivePropertySlim <Avalonia.Media.Imaging.Bitmap>().AddTo(m_Disposables); var client = new WebClientService(); client.DownloadImage(url, Image); }
public SearchResultCommunityPageViewModel(HohoemaApp app, PageManager pageManager) : base(app, pageManager, useDefaultPageTitle: false) { ChangeRequireServiceLevel(HohoemaAppServiceLevel.OnlineWithoutLoggedIn); SelectedSearchSort = new ReactivePropertySlim <CommunitySearchSortOptionListItem>(); SelectedSearchMode = new ReactivePropertySlim <CommynitySearchModeOptionListItem>(); SelectedSearchTarget = new ReactiveProperty <SearchTarget>(); }
public GeometrySettingReactive(int id) { No = new ReactivePropertySlim <int>(id); X = new ReactivePropertySlim <double>(); Y = new ReactivePropertySlim <double>(); Z = new ReactivePropertySlim <double>(); RotateZ1 = new ReactivePropertySlim <double>(); RotateY = new ReactivePropertySlim <double>(); RotateZ2 = new ReactivePropertySlim <double>(); }
public GeometrySettingReactive(GeometrySetting obj) { No = new ReactivePropertySlim <int>(obj.No); X = new ReactivePropertySlim <double>(obj.X); Y = new ReactivePropertySlim <double>(obj.Y); Z = new ReactivePropertySlim <double>(obj.Z); RotateZ1 = new ReactivePropertySlim <double>(obj.RotateZ1); RotateY = new ReactivePropertySlim <double>(obj.RotateY); RotateZ2 = new ReactivePropertySlim <double>(obj.RotateZ2); }
public SearchResultMylistPageViewModel( SearchProvider searchProvider, Services.PageManager pageManager ) : base(pageManager, useDefaultPageTitle: false) { SelectedSearchSort = new ReactivePropertySlim <SearchSortOptionListItem>(); SelectedSearchTarget = new ReactiveProperty <SearchTarget>(); SearchProvider = searchProvider; }
public ConvertFlowViewModel() { SelectedInputImageFormat = new ReactivePropertySlim <ImageFileFormat>(); SelectedConvertImageClass = new ReactivePropertySlim <ImageClass>(); SelectedOutputImageFormat = new ReactivePropertySlim <ImageFileFormat>(); SelectedInputImageFormat .Subscribe(x => Debug.WriteLine($"SelectedSourceImageFormat: {x}")); }
/// <summary>コンストラクタ。</summary> public MainWindowViewModel(IRegionManager regionMan, IDialogService dlgService) { this.regionManager = regionMan; this.dialogService = dlgService; this.Title = new ReactivePropertySlim <string>(".NET Core 3.0 Application") .AddTo(this.disposables); this.CanClose = new ReactivePropertySlim <bool>(false) .AddTo(this.disposables); }
public ListProvider(IEventAggregator eventAggregator) { id = new ReactivePropertySlim <long>(); eventAggregator .GetEvent <ListEvent>() .Subscribe(x => { Id.Value = x.Id.Value; Id.ForceNotify(); }); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="pokemonData"></param> public PokemonDetailVm(PokemonData pokemonData) : base(pokemonData) { DamageCalcVm = new ReactivePropertySlim <DamageCalcVm>(); UpdateFormSource(); ParameterCalculator.SetPokemon(pokemonData.Name, pokemonData.Form); Ev = new ParameterVm(new ParameterData <int>()); Iv = new ParameterVm(new ParameterData <int>(31, 31, 31, 31, 31, 31)); Param = new ParameterVm(new ParameterData <int>()); Personality = new ReactivePropertySlim <string>(string.Empty); Level = new ReactiveProperty <int>(50).AddTo(CompositeDisposable); ClipBoardParameter = new ReactiveProperty <string>(string.Empty); SetIvCommand = new DelegateCommand <string>(x => Iv.Model.Set(x)); SetEvCommand = new DelegateCommand <string>(x => Ev.Model.Set(x)); ChangePokemonCommand = new DelegateCommand <PokemonData>(x => { ChangePokemon(x.Name, x.Form); }); ShowDetailCommand = new DelegateCommand(() => Messenger.Raise(new TransitionMessage(new PokemonDetailVm(Model), "ShowDetail"))); NameWithSearchBox = new ReactiveProperty <string>(string.Empty).AddTo(CompositeDisposable); NameWithSearchBox.Subscribe(_ => ChangePokemon(_, null)).AddTo(CompositeDisposable); Observable.Merge( Ev.Model.PropertyChangedAsObservable().ToUnit(), Iv.Model.PropertyChangedAsObservable().ToUnit(), Personality.ToUnit(), Level.ToUnit()) .StartWith() .Throttle(TimeSpan.FromMilliseconds(50)) .ObserveOnDispatcher() .Do(_ => UpdateCalculator()) .Do(_ => UpdateFromParameter()) .Do(_ => GenerateClipBoardText()) .Subscribe() .AddTo(CompositeDisposable); Param.Model.PropertyChangedAsObservable() .StartWith() .Throttle(TimeSpan.FromMilliseconds(50)) .ObserveOnDispatcher() .Do(_ => UpdateFromParameter()) .Do(_ => GenerateClipBoardText()) .Subscribe() .AddTo(CompositeDisposable); // 努力値合計と残努力値の適用 TotalEv = Ev.Model .PropertyChangedAsObservable() .StartWith() .Select(x => Ev.Model.ToArray().Sum()) .Select(x => $"計{x}残{510 - x}") .ToReactiveProperty() .AddTo(CompositeDisposable); }
/// <summary> /// RxProperty POCO binding support method. /// </summary> /// <typeparam name="T">ReactiveProperty type parameter</typeparam> /// <typeparam name="TTarget">Binding target type</typeparam> /// <typeparam name="TProperty">Binding target property type</typeparam> /// <param name="self">Source ReactiveProperty</param> /// <param name="target">Binding target instance.</param> /// <param name="propertySelector">Binding target property selector.</param> /// <param name="mode">Binding mode</param> /// <param name="convert">source -> target converter.</param> /// <param name="convertBack">target -> source converter.</param> /// <param name="targetUpdateTrigger">targetUpdateTrigger. required TowWay and OneWayToSource</param> /// <param name="propertyFallbackValue">target error value.</param> /// <param name="sourceFallbackValue">source error value.</param> /// <returns>Release binding disposable.</returns> public static IDisposable BindTo <T, TTarget, TProperty>( this ReactivePropertySlim <T> self, TTarget target, Expression <Func <TTarget, TProperty> > propertySelector, BindingMode mode = BindingMode.OneWay, Func <T, TProperty> convert = null, Func <TProperty, T> convertBack = null, IObservable <Unit> targetUpdateTrigger = null, TProperty propertyFallbackValue = default(TProperty), T sourceFallbackValue = default(T)) { if (convert == null) { convert = value => (TProperty)Convert.ChangeType(value, typeof(TProperty)); } if (convertBack == null) { convertBack = value => (T)Convert.ChangeType(value, typeof(T)); } switch (mode) { case BindingMode.OneWay: return(CreateOneWayBinding( self, target, propertySelector, convert, propertyFallbackValue)); case BindingMode.TwoWay: return(CreateTowWayBinding( self, target, propertySelector, convert, convertBack, targetUpdateTrigger, propertyFallbackValue, sourceFallbackValue)); case BindingMode.OneWayToSource: return(CreateOneWayToSourceBinding( self, target, propertySelector, convertBack, targetUpdateTrigger, sourceFallbackValue)); default: throw new NotSupportedException(); } }
public void NoDistinctUntilChanged() { var rp = new ReactivePropertySlim <string>(mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe); var list = new List <string>(); rp.Subscribe(list.Add); rp.Value = "Hello world"; rp.Value = "Hello world"; rp.Value = "Hello japan"; list.Is(null, "Hello world", "Hello world", "Hello japan"); }
public UserPageViewModel(INavigationService navigationService, IPageDialogService pageDialogService, IAuthService authService) : base(navigationService) { _pageDialogService = pageDialogService; _authService = authService; Title = "User"; _user.Value = CrossFirebaseAuth.Current.Instance.CurrentUser; Name = new ReactivePropertySlim <string>(_user.Value?.DisplayName); Email = new ReactivePropertySlim <string>(_user.Value?.Email); PhoneNumber = new ReactivePropertySlim <string>(_user.Value?.PhoneNumber); IsLinkedWithGoogle = _user.Where(user => user != null) .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.GoogleAuthProvider.ProviderId) != null) .ToReadOnlyReactivePropertySlim(); IsLinkedWithTwitter = _user.Where(user => user != null) .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.TwitterAuthProvider.ProviderId) != null) .ToReadOnlyReactivePropertySlim(); IsLinkedWithFacebook = _user.Where(user => user != null) .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.FacebookAuthProvider.ProviderId) != null) .ToReadOnlyReactivePropertySlim(); IsLinkedWithGitHub = _user.Where(user => user != null) .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.GitHubAuthProvider.ProviderId) != null) .ToReadOnlyReactivePropertySlim(); _user.Where(user => user != null) .Select(user => user.DisplayName) .DistinctUntilChanged() .Subscribe(name => Name.Value = name); _user.Where(user => user != null) .Select(user => user.Email) .DistinctUntilChanged() .Subscribe(email => Email.Value = email); _user.Where(user => user != null) .Select(user => user.PhoneNumber) .DistinctUntilChanged() .Subscribe(phoneNumber => PhoneNumber.Value = phoneNumber); UpdateNameCommand.Subscribe(UpdateName); UpdateEmailCommand.Subscribe(UpdateEmail); UpdatePhoneNumberCommand.Subscribe(UpdatePhoneNumber); SignOutCommand.Subscribe(SignOut); LinkOrUnlinkWithGoogleCommand.Subscribe(() => IsLinkedWithGoogle.Value ? UnlinkWithGoogle() : LinkWithGoogle()); LinkOrUnlinkWithTwitterCommand.Subscribe(() => IsLinkedWithTwitter.Value ? UnlinkWithTwitter() : LinkWithTwitter()); LinkOrUnlinkWithFacebookCommand.Subscribe(() => IsLinkedWithFacebook.Value ? UnlinkWithFacebook() : LinkWithFacebook()); LinkOrUnlinkWithGitHubCommand.Subscribe(() => IsLinkedWithGitHub.Value ? UnlinkWithGitHub() : LinkWithGitHub()); DeleteCommand.Subscribe(Delete); }
/// <summary> /// ビューにバインドされている項目を初期化します /// </summary> private void InitializeBindings() { var assembly = System.Reflection.Assembly.GetExecutingAssembly(); this.WindowTitle = new ReactivePropertySlim <string>().AddTo(this._disposables_); this.WindowTitle.Value = $"{ Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]) } (ver.{ System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion })"; this.ListBoxSelectedItem = new ReactivePropertySlim <ScreenItem>().AddTo(this._disposables_); this.ListBoxSelectedItem.Subscribe(_ => this.ListBox_SelectedItemChanged()); this.ListBoxItemsSource = new ReadOnlyCollection <ScreenItem>(CreateScreenItemList()); }
public SelectLineModel() { var imageSourceSize = MyImage.ToRoixIntSize(); Line = new ReactivePropertySlim <RoixBorderIntLine>(initialValue: RoixIntLine.Zero.ToRoixBorder(imageSourceSize)); PointsOnLine = Line .Where(borderLine => borderLine.Border == imageSourceSize) .Select(borderLine => borderLine.ClipToBorder().Line.GetIntPointsOnLine().ToArray()) .ToReadOnlyReactiveProperty <IReadOnlyList <RoixIntPoint> >(); }
public void ForceNotify() { var rp = new ReactivePropertySlim <int>(0); var collector = new List <int>(); rp.Subscribe(collector.Add); collector.Is(0); rp.ForceNotify(); collector.Is(0, 0); }
/// <summary>コンストラクタ。</summary> /// <param name="winService"></param> public StartUpPanelViewModel(IMainWindowService winService) { this.mainWindowService = winService; this.HamburgerMenuDisplayMode = this.mainWindowService.HamburgerMenuDisplayMode .AddTo(this.disposable); this.IsHamburgerMenuPanelOpened = this.mainWindowService.IsHamburgerMenuPanelOpened .AddTo(this.disposable); this.ContentControlTransition = this.mainWindowService.ContentControlTransition .AddTo(this.disposable); }
public PhysicalRecord() : base() { this.MeasurementDate = new ReactivePropertySlim <DateTime?>(null); this.Height = new ReactivePropertySlim <decimal>(0); this.Weight = new ReactivePropertySlim <decimal>(0); this.bmi = new ReactivePropertySlim <decimal>(0); this.Height.Subscribe(_ => this.setBmi()); this.Weight.Subscribe(_ => this.setBmi()); }
public VoiceParameterChangeNotifier(GlobalVolume globalVolume) { _globalVolume = globalVolume; _voiceParameter = new ReactivePropertySlim <VoiceParameter>(ConvertVoiceParameter()); _globalVolumeDisposable = _globalVolume.Volume .Subscribe(_ => { _voiceParameter.Value = ConvertVoiceParameter(); }); }
/// <summary>デフォルトコンストラクタ。</summary> public BleachCharacter() { this.Name = new ReactivePropertySlim <string>(string.Empty); this.Code = new ReactiveProperty <string>(string.Empty); //this.Code.Where(c => c.Length == 0 || c.Length == 3) // .Subscribe(c => this.onChangeCode(c)); this.Yomigana = new ReactivePropertySlim <string>(string.Empty); this.Zanpakuto = new ReactivePropertySlim <string>(string.Empty); this.Bankai = new ReactivePropertySlim <string>(string.Empty); }
/// <summary> /// コンストラクタ /// </summary> internal PlaylistContentViewViewModel( IYouTubeService youTubeService, IWebClientService webClientService, IPlaylistListViewViewModel playlistListViewViewModel) { m_YouTubeService = youTubeService; m_WebClientService = webClientService; m_PlaylistListViewViewModel = playlistListViewViewModel; playlistListViewViewModel.SelectionChanged += PlaylistListViewViewModel_SelectionChanged; Title = new ReactivePropertySlim <string>().AddTo(m_Disposables); Description = new ReactivePropertySlim <string>().AddTo(m_Disposables); PlaylistItemList = new ReactiveCollection <PlaylistItemViewModel>().AddTo(m_Disposables); // コマンドの生成 Playlist = new ReactivePropertySlim <Playlist?>().AddTo(m_Disposables); CanAddVideosToPlaylistItemAsync = new ReactivePropertySlim <bool>().AddTo(m_Disposables); CanRemovePlaylistItemAsync = new ReactivePropertySlim <bool>().AddTo(m_Disposables); CanMovePlaylistItemAsync = new ReactivePropertySlim <bool>().AddTo(m_Disposables); CanClonePlaylistItemsFromPlaylist = new ReactivePropertySlim <bool>().AddTo(m_Disposables); CanAddOrClonePlaylistItems = new ReactivePropertySlim <bool>().AddTo(m_Disposables); Playlist.Subscribe(v => { CanAddVideosToPlaylistItemAsync.Value = (v != null); CanRemovePlaylistItemAsync.Value = (v != null); CanMovePlaylistItemAsync.Value = (v != null); CanClonePlaylistItemsFromPlaylist.Value = (v != null); CanAddOrClonePlaylistItems.Value = (v != null); }); AddVideosToPlaylistItemAsyncCommand = CanAddVideosToPlaylistItemAsync .ToReactiveCommand() .WithSubscribe(async() => await AddVideosToPlaylistItemAsync()) .AddTo(m_Disposables); RemovePlaylistItemAsyncCommand = CanRemovePlaylistItemAsync .ToReactiveCommand() .WithSubscribe(async() => await RemovePlaylistItemAsync()) .AddTo(m_Disposables); MovePlaylistItemAsyncCommand = CanMovePlaylistItemAsync .ToReactiveCommand <IPlaylistListViewItemViewModel>() .WithSubscribe(async param => await MovePlaylistItemAsync(param)) .AddTo(m_Disposables); ClonePlaylistItemsFromPlaylistCommand = CanClonePlaylistItemsFromPlaylist .ToReactiveCommand() .WithSubscribe(async() => await ClonePlaylistItemsFromPlaylist()) .AddTo(m_Disposables); AddOrClonePlaylistItemsCommand = CanAddOrClonePlaylistItems .ToReactiveCommand() .WithSubscribe(async() => await AddOrClonePlaylistItems()) .AddTo(m_Disposables); // ダイアログを表示するインタラクションを保持 ShowAddPlaylistItemDialog = new Interaction <Unit, AddPlaylistItemDialogViewModel>(); ShowClonePlaylistItemsDialog = new Interaction <Unit, ClonePlaylistItemsDialogViewModel>(); ShowAddOrClonePlaylistItemsDialog = new Interaction <Unit, AddOrClonePlaylistItemsDialogViewModel>(); }
public void CustomEqualityComparer() { var rp = new ReactivePropertySlim <string>(equalityComparer: new IgnoreCaseComparer()); var list = new List <string>(); rp.Subscribe(list.Add); rp.Value = "Hello world"; rp.Value = "HELLO WORLD"; rp.Value = "Hello japan"; list.Is(null, "Hello world", "Hello japan"); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="video">動画</param> /// <param name="webClientService">Webクライエントサービス</param> public VideoViewModel(Video video, IWebClientService webClientService) { Image = new ReactivePropertySlim <Avalonia.Media.Imaging.Bitmap>().AddTo(m_Disposables); IsChecked = new ReactivePropertySlim <bool>().AddTo(m_Disposables); m_Video = video; m_WebClientService = webClientService; if (string.IsNullOrEmpty(video.ThumbnailUrl) == false) { m_WebClientService.DownloadImage(video.ThumbnailUrl, Image); } }
public void 削除() { var fileEntity1 = new FileEntity( "test", new PhysicalFileName(new Guid("2DA0C0DC-8EB9-4DF2-B224-DF57CC5671DA")), new FileSize(1230), new Comment("This is a pen.\n") ); var fileEntitySlim1 = new ReactivePropertySlim <FileEntity>(fileEntity1).ToReadOnlyReactivePropertySlim(); var fileEntity2 = new FileEntity( "test2", new PhysicalFileName(new Guid("2DA0C0DC-8EB9-4DF2-B224-DF57CC5671DB")), new FileSize(1300234), new Comment("This is a \r\npen.") ); var fileEntitySlim2 = new ReactivePropertySlim <FileEntity>(fileEntity2).ToReadOnlyReactivePropertySlim(); var fileDatabaseMock = new Mock <IFileDatabaseRepository>(); var entities = new List <FileEntity>(); entities.Add(fileEntity1); entities.Add(fileEntity2); fileDatabaseMock.Setup(x => x.GetData()).Returns(entities); fileDatabaseMock.Setup(x => x.Delete(It.IsAny <FileEntity>())) .Callback <FileEntity>(value => { entities.RemoveAll(entity => entity.Equals(value)); fileDatabaseMock .Setup(x => x.GetData()) .Returns(() => entities); }); var viewModel = new FileListViewModel( fileDatabaseMock.Object, null, null ); viewModel.FileList.Count.Is(2); viewModel.Delete(fileEntitySlim1); viewModel.FileList.Count.Is(1); viewModel.FileList[0].LogicalFileName.Value.Is("test2"); viewModel.FileList[0].PhysicalFileName.Value.Is("2DA0C0DC-8EB9-4DF2-B224-DF57CC5671DB"); viewModel.FileList[0].FileSize.Value.Is("1.24 MB"); viewModel.FileList[0].Comment.Value.Is("This is a pen."); viewModel.Delete(fileEntitySlim2); viewModel.FileList.Count.Is(0); }
public DeployToOpenShiftViewModel() { Masters = model.Masters.ToReadOnlyReactiveCollection(m => new OpenShiftMasterViewModel(m)); SelectedMaster = new ReactivePropertySlim <OpenShiftMasterViewModel>(); SelectedMaster .Where(x => x != null) .Subscribe(x => model.SelectedMaster.Value = x.Model) .AddTo(Disposable); Projects = model.Projects.ToReadOnlyReactiveCollection(); SelectedNameSpace = model.SelectedProject.ToReactivePropertyAsSynchronized(x => x.Value); Name = model.Name .ToReactiveProperty() .SetValidateAttribute(() => Name) .AddTo(Disposable); Host = model.Host .ToReactiveProperty() .SetValidateAttribute(() => Host) .AddTo(Disposable); MemoryLimit = model.MemoryLimit .ToReactiveProperty() .SetValidateAttribute(() => MemoryLimit) .AddTo(Disposable); GitSource = model.GitSource .ToReactiveProperty() .SetValidateAttribute(() => GitSource) .AddTo(Disposable); GitRef = model.GitRef .ToReactiveProperty() .SetValidateAttribute(() => GitRef) .AddTo(Disposable); StartupProject = model.StartupProject .ToReactiveProperty() .SetValidateAttribute(() => StartupProject) .AddTo(Disposable); IsDeploying = model.IsDeploying.ToReadOnlyReactivePropertySlim(); Message = model.Message.ToReadOnlyReactivePropertySlim(); DeployCommand = SelectedMaster.Select(s => s != null) .ToReactiveCommand() .WithSubscribe(() => { model.StartDeploy(); }); }
public SearchResultMylistPageViewModel( ApplicationLayoutManager applicationLayoutManager, SearchProvider searchProvider, Services.PageManager pageManager ) { SelectedSearchSort = new ReactivePropertySlim <SearchSortOptionListItem>(); SelectedSearchTarget = new ReactiveProperty <SearchTarget>(); ApplicationLayoutManager = applicationLayoutManager; SearchProvider = searchProvider; PageManager = pageManager; }
public void BindToOneWayTestForRPSlim() { var target = new ReactivePropertySlim <string>(); var obj = new Poco(); target.BindTo(obj, o => o.Name); obj.Name.IsNull(); target.Value = "Hello world"; obj.Name.Is("Hello world"); }
public EventToReactiveViewModel() { MousePosition = new ReactivePropertySlim <string>() .AddTo(Disposables); CanExecute = new ReactivePropertySlim <bool>(true) .AddTo(Disposables); OpenFileCommand = CanExecute.ToReactiveCommand <string>() .AddTo(Disposables); OpenedFile = OpenFileCommand.Select(x => $"You selected {x}") .ToReadOnlyReactivePropertySlim() .AddTo(Disposables); }
public OpenShiftMasterModel(OpenShiftMaster m) { Name = new ReactivePropertySlim <string>(m.Name); MasterUrl = new ReactivePropertySlim <string>(m.MasterUrl); Token = new ReactivePropertySlim <string>(m.Token); Projects = new ReactiveCollection <ProjectModel>(); ServicePointManager.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return(true); }; }
/// <summary> /// コンストラクタ /// </summary> /// <param name="video">動画</param> /// <param name="webClientService">Webクライエントサービス</param> public PlaylistViewModel(Playlist playlist, IWebClientService webClientService) { Image = new ReactivePropertySlim <Avalonia.Media.Imaging.Bitmap>().AddTo(m_Disposables); IsChecked = new ReactivePropertySlim <bool>().AddTo(m_Disposables); m_Playlist = playlist; m_WebClientService = webClientService; if (string.IsNullOrEmpty(playlist.ThumbnailUrl) == false) { m_WebClientService.DownloadImage(playlist.ThumbnailUrl, Image); } }