public GeneralViewModel() { _players = new DispatcherCollection<DisplayableItem<string>>(DispatcherHelper.UIDispatcher); _players.Add(new DisplayableItem<string>("mpc", "Media General Classic")); _screens = new DispatcherCollection<DisplayableItem<int>>(DispatcherHelper.UIDispatcher); var i = 1; foreach (Screen screen in Screen.AllScreens) { _screens.Add(new DisplayableItem<int>(i++, ScreenUtils.GetDisplayDevice(screen.DeviceName).DeviceString)); } CurrentScreen = App.Config.ScreenNo; _monitorDirectories = new ObservableCollection<string>(App.Config.MonitorDirectories); var monitorDirectoriesListener = new CollectionChangedEventListener(_monitorDirectories) { (sender, args) => { App.Config.MonitorDirectories = _monitorDirectories; App.Client.ResetLibraryUpdater(); } }; CompositeDisposable.Add(monitorDirectoriesListener); }
public void BasicConstructorLifeCycleTest() { var listenerSuccess = false; var publisher = new TestEventPublisher(); var listener = new CollectionChangedEventListener(publisher, (sender, e) => listenerSuccess = true); //------------------ listenerSuccess.Is(false); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); listenerSuccess.Is(true); //------------------ listenerSuccess = false; listener.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); listenerSuccess.Is(false); try { listener.RegisterHandler((sender, e) => listenerSuccess = true); } catch (Exception e) { e.GetType().Is(typeof(ObjectDisposedException)); } }
public void FilteredHandlerLifeCycleTest() { var handler1Called = false; var handler2Called = false; var handler3Called = false; var publisher = new TestEventPublisher(); var listener = new CollectionChangedEventListener(publisher); //------------------ listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; }); listener.RegisterHandler(NotifyCollectionChangedAction.Remove, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true; }); listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler3Called = true; }); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(true); handler2Called.Is(true); handler3Called.Is(true); //------------------ handler1Called = false; handler2Called = false; handler3Called = false; listener.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(false); handler2Called.Is(false); handler3Called.Is(false); }
public void MultipleHandlerLifeCycleTest() { var handler1Success = false; var handler2Success = false; var publisher = new TestEventPublisher(); var listener = new CollectionChangedEventListener(publisher); //------------------ handler1Success.Is(false); handler2Success.Is(false); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Success.Is(false); handler2Success.Is(false); //------------------ listener.RegisterHandler((sender, e) => handler1Success = true); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Success.Is(true); handler2Success.Is(false); //------------------ handler1Success = false; handler2Success = false; listener.RegisterHandler((sender, e) => handler2Success = true); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Success.Is(true); handler2Success.Is(true); //------------------ handler1Success = false; handler2Success = false; listener.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Success.Is(false); handler2Success.Is(false); }
public void SourceReferenceMemoryLeakTest() { var handler1Success = false; var publisherStrongReference = new TestEventPublisher(); var publisherWeakReference = new WeakReference<TestEventPublisher>(publisherStrongReference); var listener = new CollectionChangedEventListener(publisherStrongReference); listener.RegisterHandler((sender, e) => handler1Success = true); publisherStrongReference.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Success.Is(true); listener.Dispose(); publisherStrongReference = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); TestEventPublisher resultPublisher = null; publisherWeakReference.TryGetTarget(out resultPublisher).Is(false); resultPublisher.IsNull(); }
public void MultiThreadHandlerTest() { var publisher = new TestEventPublisher(); var listener = new CollectionChangedEventListener(publisher); var handlerCalledCount = 0; var parentTask = new Task(() => { var tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.AttachedToParent); for (int i = 0; i < 50; i++) { tf.StartNew(() => { for (int f = 0; f < 500; f++) { listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handlerCalledCount++; }); } }); } }); parentTask.Start(); parentTask.Wait(); handlerCalledCount.Is(0); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handlerCalledCount.Is(25000); handlerCalledCount = 0; listener.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handlerCalledCount.Is(0); }
public void AddHandlerKindTest() { var handler1Called = false; var handler2Called = false; var handler3Called = false; var handler4Called = false; var handler5Called = false; var publisher = new TestEventPublisher(); var listener1 = new CollectionChangedEventListener(publisher) { {NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; }}, {NotifyCollectionChangedAction.Remove, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true;}, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler3Called = true;} }, (sender,e) => handler4Called = true, {NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler5Called = true; }} }; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Reset,null); handler1Called.Is(false); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(true); handler5Called.Is(false); handler4Called = false; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Called.Is(true); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(true); handler5Called.Is(true); handler1Called = false; handler4Called = false; handler5Called = false; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(false); handler2Called.Is(true); handler3Called.Is(true); handler4Called.Is(true); handler5Called.Is(false); handler1Called = false; handler2Called = false; handler3Called = false; handler4Called = false; handler5Called = false; listener1.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(false); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(false); handler5Called.Is(false); }
public HandlerMemoryLeakTestClass(INotifyCollectionChanged publisher) { Listener = new CollectionChangedEventListener(publisher); // This handler refers "this". NotifyCollectionChangedEventHandler handler = (sender, e) => { ToString(); }; Listener.RegisterHandler(handler); Listener.RegisterHandler(NotifyCollectionChangedAction.Reset, handler); }
/// <summary> /// リスナーを生成します。 /// </summary> private void CreateListener() { var h = _searchTextChangedSubject .Throttle(TimeSpan.FromMilliseconds(1000)) //.DistinctUntilChanged() .Subscribe(x => { // テキストフィルタリングする _client.FilteringLibrary(x); }); // データベース変更イベントリスナー var databaseListener = new CollectionChangedEventListener(_client.Databases) { (sender, args) => { // データベース選択復元 CurrentDatabase = Databases.SingleOrDefault(x => x.Name == _client.AppConfig.SelectDatabase); } }; CompositeDisposable.Add(databaseListener); // ライブラリ変更イベントリスナー var libraryListener = new CollectionChangedEventListener(_client.Libraries) { (sender, args) => LibraryCount = _client.Libraries.Count() }; CompositeDisposable.Add(libraryListener); // フィルタリング変更イベントリスナー var filteringListener = new CollectionChangedEventListener(_client.Filterings) { (sender, args) => { // フィルタリング選択復元 var filteringSelect = _filterings.FirstOrDefault(x => x.Model.DisplayValue == AppConfig.SelectFiltering); if (filteringSelect != null) filteringSelect.IsSelected = true; } }; CompositeDisposable.Add(filteringListener); // 設定変更イベントリスナー var configListener = new PropertyChangedEventListener(AppConfig) { {"AccentColor", (sender, args) => AppearanceManager.Current.AccentColor = AppConfig.AccentColor}, { "SelectedTheme", (sender, args) => AppearanceManager.Current.ThemeSource = AppConfig.SelectedTheme == "light" ? AppearanceManager.LightThemeSource : AppearanceManager.DarkThemeSource }, { "Language", (sender, args) => { MovselexResource.Current.ChangeCulture(AppConfig.Language); _client.ReloadFiltering(); } }, { "MpcExePath", (sender, args) => { CanThrow = !String.IsNullOrEmpty(AppConfig.MpcExePath); if (_client.IsInitialized) _client.ResetBackgroundWorker(); } } }; CompositeDisposable.Add(configListener); }
public void AddHandlerKindTest() { var handler1Called = false; var handler2Called = false; var handler3Called = false; var handler4Called = false; var handler5Called = false; var publisher = new TestEventPublisher(); var listener1 = new CollectionChangedEventListener(publisher) { { NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; } }, { NotifyCollectionChangedAction.Remove, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true; }, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler3Called = true; } }, (sender, e) => handler4Called = true, { NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler5Called = true; } } }; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Reset, null); handler1Called.Is(false); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(true); handler5Called.Is(false); handler4Called = false; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); handler1Called.Is(true); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(true); handler5Called.Is(true); handler1Called = false; handler4Called = false; handler5Called = false; publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(false); handler2Called.Is(true); handler3Called.Is(true); handler4Called.Is(true); handler5Called.Is(false); handler1Called = false; handler2Called = false; handler3Called = false; handler4Called = false; handler5Called = false; listener1.Dispose(); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null); publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null); handler1Called.Is(false); handler2Called.Is(false); handler3Called.Is(false); handler4Called.Is(false); handler5Called.Is(false); }
public static ReadOnlyDispatcherCollection <TViewModel> CreateReadOnlyDispatcherCollection <TModel, TViewModel>(IList <TModel> source, Func <TModel, TViewModel> converter, Dispatcher dispatcher) { if (source == null) { throw new ArgumentNullException("source"); } var sourceAsNotifyCollection = source as INotifyCollectionChanged; if (sourceAsNotifyCollection == null) { throw new ArgumentException("sourceがINotifyCollectionChangedを実装していません"); } var initCollection = new ObservableCollection <TViewModel>(); var internalLock = new object(); lock (internalLock) { var target = new DispatcherCollection <TViewModel>(initCollection, dispatcher); var result = new ReadOnlyDispatcherCollection <TViewModel>(target); var collectionChangedListener = new CollectionChangedEventListener(sourceAsNotifyCollection); result.EventListeners.Add(collectionChangedListener); collectionChangedListener.RegisterHandler((sender, e) => { lock (internalLock) { switch (e.Action) { case NotifyCollectionChangedAction.Add: target.Insert(e.NewStartingIndex, converter((TModel)e.NewItems[0])); break; case NotifyCollectionChangedAction.Move: target.Move(e.OldStartingIndex, e.NewStartingIndex); break; case NotifyCollectionChangedAction.Remove: if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel))) { ((IDisposable)target[e.OldStartingIndex]).Dispose(); } target.RemoveAt(e.OldStartingIndex); break; case NotifyCollectionChangedAction.Replace: if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel))) { ((IDisposable)target[e.NewStartingIndex]).Dispose(); } target[e.NewStartingIndex] = converter((TModel)e.NewItems[0]); break; case NotifyCollectionChangedAction.Reset: if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel))) { foreach (IDisposable item in target) { item.Dispose(); } } target.Clear(); break; default: throw new ArgumentException(); } } }); foreach (var model in source) { initCollection.Add(converter(model)); } return(result); } }