/// <summary> /// Raises this object's PropertyChanged event for one property and all its dependent /// properties. /// </summary> /// <param name="propertyName">The name of the property that has a new value.</param> protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { // Verify that the notified property actually exists in the current object. This can // reveal misspelled properties and missing notifications. It's only checked in Debug // builds for performance and stability reasons. #if DEBUG if (!TypeDescriptor.GetProperties(this).OfType <PropertyDescriptor>().Any(d => d.Name == propertyName)) { throw new ArgumentException("Notifying a change of non-existing property " + this.GetType().Name + "." + propertyName); } #endif // Call On…Changed methods that are marked with the [PropertyChangedHandler] attribute foreach (var changeHandler in PropertyChangedHandlers.GetValuesOrEmpty(propertyName)) { changeHandler(); } // Raise PropertyChanged event, if there is a handler listening to it var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } // Also notify changes for dependent properties // (This could be moved inside the (handler != null) check for improved performance, but // then it could miss out On…Changed method calls for dependent properties, which might // be a nice feature.) foreach (var dependentPropertyName in DependentNotifications.GetValuesOrEmpty(propertyName)) { OnPropertyChanged(dependentPropertyName); } }
public HamburgerMenu() { DebugWrite(); if (Windows.ApplicationModel.DesignMode.DesignModeEnabled) { InitializeComponent(); } else { // hamburger menu property changes PropertyChangedHandlers.Add(nameof(IsFullScreen), e => FullScreenPropertyChanged((bool?)e.OldValue, (bool?)e.NewValue)); PropertyChangedHandlers.Add(nameof(Selected), e => SelectedPropertyChanged(e.OldValue as HamburgerButtonInfo, e.NewValue as HamburgerButtonInfo)); PropertyChangedHandlers.Add(nameof(DisplayMode), e => DisplayModePropertyChanged((SplitViewDisplayMode)e.OldValue, (SplitViewDisplayMode)e.NewValue)); PropertyChangedHandlers.Add(nameof(HamburgerButtonVisibility), e => HamburgerButtonVisibilityPropertyChanged((Visibility)e.NewValue)); PropertyChangedHandlers.Add(nameof(IsOpen), e => IsOpenPropertyChanged((bool)e.OldValue, (bool)e.NewValue)); PropertyChangedHandlers.Add(nameof(NavigationService), e => NavigationServicePropertyChanged(e.OldValue as INavigationService, e.NewValue as INavigationService)); PropertyChangedHandlers.Add(nameof(AccentColor), e => AccentColorPropertyChanged(e.OldValue as Color?, e.NewValue as Color?)); // default values; PrimaryButtons = new ObservableCollection <HamburgerButtonInfo>(); SecondaryButtons = new ObservableCollection <HamburgerButtonInfo>(); // calling this now, let's handlers wire up before styles apply InitializeComponent(); // control event handlers Loaded += HamburgerMenu_Loaded; LayoutUpdated += HamburgerMenu_LayoutUpdated; KeyboardService.Instance.AfterMenuGesture += () => IsOpen = !IsOpen; } }
public HamburgerMenu() { DebugWrite(); if (Windows.ApplicationModel.DesignMode.DesignModeEnabled) { InitializeComponent(); } else { // hamburger menu property changes PropertyChangedHandlers.Add(nameof(IsFullScreen), e => FullScreenPropertyChanged((bool?)e.OldValue, (bool?)e.NewValue)); PropertyChangedHandlers.Add(nameof(Selected), e => SelectedPropertyChanged(e.OldValue as HamburgerButtonInfo, e.NewValue as HamburgerButtonInfo)); PropertyChangedHandlers.Add(nameof(DisplayMode), e => DisplayModePropertyChanged((SplitViewDisplayMode)e.OldValue, (SplitViewDisplayMode)e.NewValue)); PropertyChangedHandlers.Add(nameof(HamburgerButtonVisibility), e => HamburgerButtonVisibilityPropertyChanged((Visibility)e.NewValue)); PropertyChangedHandlers.Add(nameof(IsOpen), e => IsOpenPropertyChanged((bool)e.OldValue, (bool)e.NewValue)); PropertyChangedHandlers.Add(nameof(NavigationService), e => NavigationServicePropertyChanged(e.OldValue as INavigationService, e.NewValue as INavigationService)); PropertyChangedHandlers.Add(nameof(AccentColor), e => AccentColorPropertyChanged(e.OldValue as Color?, e.NewValue as Color?)); PropertyChangedHandlers.Add(nameof(HeaderContent), e => HeaderContentPropertyChanged(e.OldValue, e.NewValue)); // default values; PrimaryButtons = new ObservableCollection <HamburgerButtonInfo>(); SecondaryButtons = new ObservableCollection <HamburgerButtonInfo>(); // calling this now, let's handlers wire up before styles apply InitializeComponent(); // control event handlers Loaded += HamburgerMenu_Loaded; LayoutUpdated += HamburgerMenu_LayoutUpdated; // xbox controller menu button support KeyboardService.Instance.AfterMenuGesture += () => { HamburgerCommand.Execute(); HamburgerButton.Focus(FocusState.Programmatic); }; GotFocus += (s, e) => { var element = FocusManager.GetFocusedElement() as FrameworkElement; var name = element?.Name ?? "no-name"; var content = (((element as ContentControl)?.Content as StackPanel)?.Children[0] as SymbolIcon)?.Symbol.ToString(); if (content == null) { content = (element as ContentControl)?.Content?.ToString() ?? "no-content"; } var value = $"{element?.ToString() ?? "null"} {name} {content}"; DebugWrite(value, caller: "GotFocus"); }; } }