예제 #1
0
        public static void SetupDataContextChanged <T>(this FrameworkElement element, Action <T> action) where T : class
        {
            var context = element.DataContext;

            if (context != null)
            {
                if (action != null)
                {
                    action.Invoke(context as T);
                }
                return;
            }

            var cleanup = new DisposeManager();

            DependencyPropertyChangedEventHandler handler = (s, e) =>
            {
                cleanup.Dispose();
                if (action != null)
                {
                    action.Invoke(e.NewValue as T);
                }
            };

            cleanup.AddEvent(h => element.DataContextChanged += h, h => element.DataContextChanged -= h, handler);
        }
예제 #2
0
        private FsContainer(FsContainer parent)
        {
            this.parent = parent;
            if (parent != null)
            {
                parent._disposeManager.Add(this);
            }

            this._disposeManager  = new DisposeManager();
            this._bindingResolver = parent?.BindingResolver ?? new BindingResolver();
        }
예제 #3
0
        private void AddProgressItem(Window window, IProgressItemViewModel <T> itemViewModel)
        {
            var viewModel = (ProgressViewModel)window.DataContext;

            viewModel.ProgressItems.Add(itemViewModel);

            var cleanup = new DisposeManager();

            cleanup.AddEvent(h => itemViewModel.Completed += h, h => itemViewModel.Completed -= h,
                             (EventHandler)((s, e) => HandleCompletedOrCanceled(cleanup, window, viewModel, itemViewModel, true)));
            cleanup.AddEvent(h => itemViewModel.Canceled += h, h => itemViewModel.Canceled -= h,
                             (EventHandler)((s, e) => HandleCompletedOrCanceled(cleanup, window, viewModel, itemViewModel, false)));
        }
예제 #4
0
        public static Task ShutdownAsync(this Dispatcher d)
        {
            var tcs = new TaskCompletionSource <int>();

            var cleanup = new DisposeManager();

            EventHandler handler = (s, e) =>
            {
                cleanup.Dispose();
                tcs.TrySetResult(0);
            };

            cleanup.AddEvent(h => d.ShutdownFinished += h, h => d.ShutdownFinished -= h, handler);
            d.BeginInvokeShutdown(DispatcherPriority.Normal);

            return(tcs.Task);
        }
        private void HandleNavigateTo(IFileSystemFolderOperations operation, TFolder selected)
        {
            if (_gridSelectionToken != null)
            {
                _gridSelectionToken.Dispose();
            }

            var gvm = _gridViewModel;

            EventHandler handler = (s, e) => gvm.SetSelectedAsync(selected as TFile);

            var token = _gridSelectionToken = new DisposeManager();

            token.AddEvent(h => gvm.FilesPopulated += h, h => gvm.FilesPopulated -= h, handler);

            _treeViewModel.SelectAsync(operation.DriveFolder);
        }
예제 #6
0
        public static void SetupLoaded(this FrameworkElement element, Action action)
        {
            if (element.IsLoaded)
            {
                action();
                return;
            }

            var cleanup = new DisposeManager();

            RoutedEventHandler handler = (s, e) =>
            {
                cleanup.Dispose();
                action();
            };

            cleanup.AddEvent(h => element.Loaded += h, h => element.Loaded -= h, handler);
        }
예제 #7
0
 private void HandleCompletedOrCanceled(DisposeManager cleanup, Window window, ProgressViewModel viewModel, IProgressItemViewModel <T> itemViewModel, bool isCompleted)
 {
     cleanup.Dispose();
     window.Dispatcher.CheckedInvoke(() =>
     {
         viewModel.ProgressItems.Remove(itemViewModel);
         if (viewModel.ProgressItems.Count == 0)
         {
             Task.Delay(1000);
             if (_window != null && _window.IsVisible)
             {
                 viewModel.OkCommand.TryExecute(null);
             }
             _window    = null;
             var result = new AsyncActivityResult <IProgressItemViewModel <T> >(isCompleted, itemViewModel);
             Completion.TrySetResult(result);
         }
     });
 }
        private async Task NavigateAsync(IFolder folder, TFolder selected)
        {
            _treeViewModel.PropertyChanged -= HandleTreePropertyChanged;

            if (_gridSelectionToken != null)
            {
                _gridSelectionToken.Dispose();
            }

            var gvm = _gridViewModel;

            EventHandler handler = (s, e) => gvm.SetSelectedAsync(selected as TFile);

            var token = _gridSelectionToken = new DisposeManager();

            token.AddEvent(h => gvm.FilesPopulated += h, h => gvm.FilesPopulated -= h, handler);

            await _treeViewModel.SelectAsync(folder);

            _treeViewModel.PropertyChanged += HandleTreePropertyChanged;
        }