/// <summary> /// Initializes a new instance of the <see cref="SimpleDataWindow" /> class. /// </summary> /// <param name="viewModel">The view model.</param> /// <param name="mode">The data window mode.</param> /// <param name="additionalButtons">The additional buttons.</param> /// <exception cref="System.NotSupportedException"></exception> protected SimpleDataWindow(IViewModel viewModel, DataWindowMode mode = DataWindowMode.OkCancel, IEnumerable <DataWindowButton> additionalButtons = null) { if (CatelEnvironment.IsInDesignMode) { return; } ThemeHelper.EnsureCatelMvvmThemeIsLoaded(); _logic = new WindowLogic(this, null, viewModel); _logic.PropertyChanged += (sender, e) => PropertyChanged?.Invoke(this, e); _logic.ViewModelChanged += (sender, e) => ViewModelChanged?.Invoke(this, e); _logic.ViewModelPropertyChanged += (sender, e) => ViewModelPropertyChanged?.Invoke(this, e); Loaded += (sender, e) => _viewLoaded?.Invoke(this, EventArgs.Empty); Unloaded += (sender, e) => _viewUnloaded?.Invoke(this, EventArgs.Empty); DataContextChanged += (sender, e) => _viewDataContextChanged?.Invoke(this, new DataContextChangedEventArgs(e.OldValue, e.NewValue)); if (additionalButtons != null) { foreach (var button in additionalButtons) { _buttons.Add(button); } } var languageService = ServiceLocator.Default.ResolveType <ILanguageService>(); if (mode == DataWindowMode.OkCancel || mode == DataWindowMode.OkCancelApply) { var button = DataWindowButton.FromAsync(languageService.GetString("OK"), OnOkExecuteAsync, OnOkCanExecute); button.IsDefault = true; _buttons.Add(button); } if (mode == DataWindowMode.OkCancel || mode == DataWindowMode.OkCancelApply) { var button = DataWindowButton.FromAsync(languageService.GetString("Cancel"), OnCancelExecuteAsync, OnCancelCanExecute); button.IsCancel = true; _buttons.Add(button); } if (mode == DataWindowMode.OkCancelApply) { var button = DataWindowButton.FromAsync(languageService.GetString("Apply"), OnApplyExecuteAsync, OnApplyCanExecute); _buttons.Add(button); } if (mode == DataWindowMode.Close) { var button = DataWindowButton.FromSync(languageService.GetString("Close"), OnCloseExecute, () => true); _buttons.Add(button); } // Call manually the first time (for injected view models) OnViewModelChanged(); this.FixBlurriness(); }
/// <summary> /// Initializes a new instance of the <see cref="UserControl"/> class. /// </summary> /// <param name="viewModel">The view model.</param> public UserControl(IViewModel viewModel) { if (CatelEnvironment.IsInDesignMode) { return; } this.FixBlurriness(); _logic = new UserControlLogic(this, null, viewModel); _logic.TargetViewPropertyChanged += (sender, e) => { #if !NET && !NETCORE // WPF already calls this method automatically OnPropertyChanged(e); PropertyChanged?.Invoke(this, e); #else // Do not call this for ActualWidth and ActualHeight WPF, will cause problems with NET 40 // on systems where NET45 is *not* installed if (!string.Equals(e.PropertyName, nameof(ActualWidth), StringComparison.InvariantCulture) && !string.Equals(e.PropertyName, nameof(ActualHeight), StringComparison.InvariantCulture)) { PropertyChanged?.Invoke(this, e); } #endif }; _logic.ViewModelClosedAsync += OnViewModelClosedAsync; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(e); ViewModelPropertyChanged?.Invoke(this, e); }; Loaded += (sender, e) => { _viewLoaded?.Invoke(this, EventArgs.Empty); OnLoaded(e); }; Unloaded += (sender, e) => { _viewUnloaded?.Invoke(this, EventArgs.Empty); OnUnloaded(e); }; this.AddDataContextChangedHandler((sender, e) => _viewDataContextChanged?.Invoke(this, new Catel.MVVM.Views.DataContextChangedEventArgs(e.OldValue, e.NewValue))); }
/// <summary> /// Initializes a new instance of the <see cref="UIViewController"/> class. /// </summary> public UIViewController() { if (CatelEnvironment.IsInDesignMode) { return; } var viewModelType = GetViewModelType(); if (viewModelType is null) { Log.Debug("GetViewModelType() returned null, using the ViewModelLocator to resolve the view model"); viewModelType = _viewModelLocator.ResolveViewModel(GetType()); if (viewModelType is null) { const string error = "The view model of the view could not be resolved. Use either the GetViewModelType() method or IViewModelLocator"; Log.Error(error); throw new NotSupportedException(error); } } _logic = new PageLogic(this, viewModelType); _logic.TargetViewPropertyChanged += (sender, e) => { OnPropertyChanged(e); PropertyChanged?.Invoke(this, e); }; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(e); ViewModelPropertyChanged?.Invoke(this, e); }; _logic.DetermineViewModelInstance += (sender, e) => { e.ViewModel = GetViewModelInstance(e.DataContext); }; _logic.DetermineViewModelType += (sender, e) => { e.ViewModelType = GetViewModelType(e.DataContext); }; _logic.ViewLoading += (sender, e) => ViewLoading?.Invoke(this); _logic.ViewLoaded += (sender, e) => ViewLoaded?.Invoke(this); _logic.ViewUnloading += (sender, e) => ViewUnloading?.Invoke(this); _logic.ViewUnloaded += (sender, e) => ViewUnloaded?.Invoke(this); }
/// <summary> /// Initializes a new instance of the <see cref="ContentPage" /> class. /// </summary> /// <param name="viewModel">The view model</param> public ContentPage(IViewModel viewModel) { _userControlLogic = new UserControlLogic(this, null, viewModel); _userControlLogic.TargetViewPropertyChanged += (sender, e) => { OnPropertyChanged(e.PropertyName); }; _userControlLogic.ViewModelClosedAsync += OnViewModelClosedAsync; _userControlLogic.ViewModelChanged += (sender, args) => { if (!ObjectHelper.AreEqual(BindingContext, _userControlLogic.ViewModel)) { BindingContext = _userControlLogic.ViewModel; } }; _userControlLogic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(e); ViewModelPropertyChanged?.Invoke(this, e); }; Loaded += (sender, e) => { // _viewLoaded?.Invoke(this); // OnLoaded(e); }; Unloaded += (sender, e) => { // _viewUnloaded?.Invoke(this); // OnUnloaded(e); }; DataContextChanged += OnDataContextChanged; }
/// <summary> /// Initializes a new instance of the <see cref="Fragment" /> class. /// </summary> /// <exception cref="System.NotSupportedException"></exception> public Fragment() { if (CatelEnvironment.IsInDesignMode) { return; } _logic = new UserControlLogic(this, null); _logic.TargetViewPropertyChanged += (sender, e) => { OnPropertyChanged(e); PropertyChanged?.Invoke(this, e); }; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(e); ViewModelPropertyChanged?.Invoke(this, e); }; }
/// <summary> /// Initializes a new instance of the <see cref="Activity"/> class. /// </summary> public Activity() { if (CatelEnvironment.IsInDesignMode) { return; } _logic = new PageLogic(this); _logic.TargetViewPropertyChanged += (sender, e) => { OnPropertyChanged(e); PropertyChanged?.Invoke(this, e); }; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(e); ViewModelPropertyChanged?.Invoke(this, e); }; }
/// <summary> /// Initializes a new instance of the <see cref="DataWindow"/> class. /// </summary> /// <param name="viewModel">The view model.</param> /// <param name="mode"><see cref="DataWindowMode"/>.</param> /// <param name="additionalButtons">The additional buttons.</param> /// <param name="defaultButton">The default button.</param> /// <param name="setOwnerAndFocus">if set to <c>true</c>, set the main window as owner window and focus the window.</param> /// <param name="infoBarMessageControlGenerationMode">The info bar message control generation mode.</param> /// <param name="focusFirstControl">if set to <c>true</c>, the first control will get the focus.</param> public DataWindow(IViewModel viewModel, DataWindowMode mode, IEnumerable <DataWindowButton> additionalButtons = null, DataWindowDefaultButton defaultButton = DataWindowDefaultButton.OK, bool setOwnerAndFocus = true, InfoBarMessageControlGenerationMode infoBarMessageControlGenerationMode = InfoBarMessageControlGenerationMode.Inline, bool focusFirstControl = true) { if (CatelEnvironment.IsInDesignMode) { return; } // Set window style (WPF doesn't allow styling on root elements of XAML files, too bad) // For more info, see http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3059c0e4-c372-4da2-b384-28f271feef05/ SetResourceReference(StyleProperty, typeof(DataWindow)); Mode = mode; DefaultButton = defaultButton; _infoBarMessageControlGenerationMode = infoBarMessageControlGenerationMode; this.FixBlurriness(); SizeToContent = SizeToContent.WidthAndHeight; ShowInTaskbar = false; ResizeMode = ResizeMode.NoResize; WindowStartupLocation = WindowStartupLocation.CenterOwner; this.ApplyIconFromApplication(); ThemeHelper.EnsureCatelMvvmThemeIsLoaded(); _logic = new WindowLogic(this, null, viewModel); _logic.TargetViewPropertyChanged += (sender, e) => { // Do not call this for ActualWidth and ActualHeight WPF, will cause problems with NET 40 // on systems where NET45 is *not* installed if (!string.Equals(e.PropertyName, nameof(ActualWidth), StringComparison.InvariantCulture) && !string.Equals(e.PropertyName, nameof(ActualHeight), StringComparison.InvariantCulture)) { PropertyChanged?.Invoke(this, e); } }; _logic.ViewModelClosedAsync += OnViewModelClosedAsync; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(sender, e); ViewModelPropertyChanged?.Invoke(this, e); }; Loaded += (sender, e) => { _viewLoaded?.Invoke(this, EventArgs.Empty); OnLoaded(e); }; Unloaded += (sender, e) => { _viewUnloaded?.Invoke(this, EventArgs.Empty); OnUnloaded(e); }; SetBinding(TitleProperty, new Binding("Title")); if (additionalButtons != null) { foreach (var button in additionalButtons) { _buttons.Add(button); } } CanClose = true; CanCloseUsingEscape = true; Loaded += (sender, e) => Initialize(); DataContextChanged += (sender, e) => _viewDataContextChanged?.Invoke(this, new DataContextChangedEventArgs(e.OldValue, e.NewValue)); // #1150 Subscribe in dispatcher to allow derived types to be the first handler Dispatcher.BeginInvoke(() => { Closing += OnDataWindowClosing; }); _focusFirstControl = focusFirstControl; if (setOwnerAndFocus) { this.SetOwnerWindowAndFocus(focusFirstControl: focusFirstControl); } else if (focusFirstControl) { this.FocusFirstControl(); } }
protected virtual void OnViewModelPropertyChanged(AudioDeviceViewModelEventArgs e) { ViewModelPropertyChanged?.Invoke(this, e); }
/// <summary> /// Initializes a new instance of the <see cref="DataWindow"/> class. /// </summary> /// <param name="viewModel">The view model.</param> /// <param name="mode"><see cref="DataWindowMode"/>.</param> /// <param name="additionalButtons">The additional buttons.</param> /// <param name="defaultButton">The default button.</param> /// <param name="setOwnerAndFocus">if set to <c>true</c>, set the main window as owner window and focus the window.</param> /// <param name="infoBarMessageControlGenerationMode">The info bar message control generation mode.</param> public MetroDataWindow(IViewModel viewModel, DataWindowMode mode, IEnumerable <DataWindowButton> additionalButtons = null, DataWindowDefaultButton defaultButton = DataWindowDefaultButton.OK, bool setOwnerAndFocus = true, InfoBarMessageControlGenerationMode infoBarMessageControlGenerationMode = InfoBarMessageControlGenerationMode.Inline) { if (CatelEnvironment.IsInDesignMode) { return; } var serviceLocator = this.GetServiceLocator(); _wrapControlService = serviceLocator.ResolveType <IWrapControlService>(); Mode = mode; DefaultButton = defaultButton; _infoBarMessageControlGenerationMode = infoBarMessageControlGenerationMode; this.FixBlurriness(); SizeToContent = SizeToContent.WidthAndHeight; ShowInTaskbar = false; ResizeMode = ResizeMode.NoResize; WindowStartupLocation = WindowStartupLocation.CenterOwner; BorderThickness = new Thickness(1d); BorderBrush = Orc.Theming.ThemeManager.Current.GetAccentColorBrush(); this.ApplyIconFromApplication(); ThemeHelper.EnsureCatelMvvmThemeIsLoaded(); _logic = new WindowLogic(this, null, viewModel); _logic.TargetViewPropertyChanged += (sender, e) => { // Do not call this for ActualWidth and ActualHeight WPF, will cause problems with NET 40 // on systems where NET45 is *not* installed if (!string.Equals(e.PropertyName, nameof(ActualWidth), StringComparison.InvariantCulture) && !string.Equals(e.PropertyName, nameof(ActualHeight), StringComparison.InvariantCulture)) { PropertyChanged?.Invoke(this, e); } }; _logic.ViewModelClosedAsync += OnViewModelClosedAsync; _logic.ViewModelChanged += (sender, e) => RaiseViewModelChanged(); _logic.ViewModelPropertyChanged += (sender, e) => { OnViewModelPropertyChanged(sender, e); ViewModelPropertyChanged?.Invoke(this, e); }; Loaded += (sender, e) => { _viewLoaded?.Invoke(this, EventArgs.Empty); OnLoaded(e); }; Unloaded += (sender, e) => { _viewUnloaded?.Invoke(this, EventArgs.Empty); OnUnloaded(e); }; SetBinding(TitleProperty, new Binding(nameof(ViewModelBase.Title))); if (additionalButtons != null) { foreach (var button in additionalButtons) { _buttons.Add(button); } } CanClose = true; CanCloseUsingEscape = true; Loaded += (sender, e) => Initialize(); Closing += OnDataWindowClosing; DataContextChanged += (sender, e) => _viewDataContextChanged?.Invoke(this, new DataContextChangedEventArgs(e.OldValue, e.NewValue)); if (setOwnerAndFocus) { this.SetOwnerWindowAndFocus(); } else { this.FocusFirstControl(); } }