diff --git a/.editorconfig b/.editorconfig index 63a46acc9..64d038bd6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -120,6 +120,51 @@ csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false +# Naming rules +dotnet_naming_rule.constants_rule.severity = warning +dotnet_naming_rule.constants_rule.style = upper_camel_case_style +dotnet_naming_rule.constants_rule.symbols = constants_symbols +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style +dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols +dotnet_naming_rule.private_instance_fields_rule.severity = warning +dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols +dotnet_naming_rule.private_static_fields_rule.severity = warning +dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols +dotnet_naming_rule.private_static_readonly_rule.severity = warning +dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols +dotnet_naming_rule.public_static_fields_rule.severity = warning +dotnet_naming_rule.public_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.public_static_fields_rule.symbols = public_static_fields_symbols +dotnet_naming_rule.static_readonly_rule.severity = warning +dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.static_readonly_rule.symbols = static_readonly_symbols +dotnet_naming_style.lower_camel_case_style.capitalization = camel_case +dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case +dotnet_naming_symbols.constants_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.constants_symbols.applicable_kinds = field +dotnet_naming_symbols.constants_symbols.required_modifiers = const +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static +dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = readonly,static +dotnet_naming_symbols.public_static_fields_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.public_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.public_static_fields_symbols.required_modifiers = static +dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.static_readonly_symbols.required_modifiers = readonly,static + # Errors and warnings # MEF006: No importing constructor diff --git a/ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs b/ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs index 79686bdba..e34675fc3 100644 --- a/ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs +++ b/ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs @@ -182,7 +182,7 @@ namespace ICSharpCode.ILSpyX.TreeView #endregion #region OnChildrenChanged - internal protected virtual void OnChildrenChanged(NotifyCollectionChangedEventArgs e) + protected internal virtual void OnChildrenChanged(NotifyCollectionChangedEventArgs e) { if (e.OldItems != null) { diff --git a/ILSpy/Analyzers/AnalyzeCommand.cs b/ILSpy/Analyzers/AnalyzeCommand.cs index 00e6b03db..d6cf8a7e9 100644 --- a/ILSpy/Analyzers/AnalyzeCommand.cs +++ b/ILSpy/Analyzers/AnalyzeCommand.cs @@ -18,27 +18,18 @@ using System.ComponentModel.Composition; using System.Linq; -using System.Windows; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpy.TreeNodes; -using TomsToolbox.Composition; - namespace ICSharpCode.ILSpy.Analyzers { [ExportContextMenuEntry(Header = nameof(Resources.Analyze), Icon = "Images/Search", Category = nameof(Resources.Analyze), InputGestureText = "Ctrl+R", Order = 100)] [PartCreationPolicy(CreationPolicy.Shared)] internal sealed class AnalyzeCommand : SimpleCommand, IContextMenuEntry { - private static readonly IExport analyzerTreeViewExport = App.ExportProvider.GetExports().Single(); - - private static AnalyzerTreeView AnalyzerTreeView { - get { - return Application.Current?.MainWindow?.IsLoaded != true ? null : analyzerTreeViewExport.Value; - } - } + private static readonly AnalyzerTreeView AnalyzerTreeView = App.ExportProvider.GetExportedValue(); public bool IsVisible(TextViewContext context) { @@ -60,17 +51,13 @@ namespace ICSharpCode.ILSpy.Analyzers .All(node => IsValidReference(node.Member)); } - bool IsValidReference(object reference) + static bool IsValidReference(object reference) { - return reference is IEntity && !(reference is IField f && f.IsConst); + return reference is IEntity and not IField { IsConst: true }; } public void Execute(TextViewContext context) { - if (AnalyzerTreeView is null) - { - return; - } if (context.SelectedTreeNodes != null) { foreach (var node in context.SelectedTreeNodes.OfType().ToArray()) @@ -86,25 +73,13 @@ namespace ICSharpCode.ILSpy.Analyzers public override bool CanExecute(object parameter) { - if (AnalyzerTreeView is null) - { - return false; - } - - if (AnalyzerTreeView is { IsKeyboardFocusWithin: true }) - { - return AnalyzerTreeView.SelectedItems.OfType().All(n => n is IMemberTreeNode); - } - - return MainWindow.Instance.SelectedNodes.All(n => n is IMemberTreeNode); + return AnalyzerTreeView.IsKeyboardFocusWithin + ? AnalyzerTreeView.SelectedItems.OfType().All(n => n is IMemberTreeNode) + : MainWindow.Instance.SelectedNodes.All(n => n is IMemberTreeNode); } public override void Execute(object parameter) { - if (AnalyzerTreeView is null) - { - return; - } if (AnalyzerTreeView.IsKeyboardFocusWithin) { foreach (var node in AnalyzerTreeView.SelectedItems.OfType().ToArray()) diff --git a/ILSpy/Analyzers/AnalyzerTreeView.cs b/ILSpy/Analyzers/AnalyzerTreeView.cs index cdc8fcbdb..132f7c1db 100644 --- a/ILSpy/Analyzers/AnalyzerTreeView.cs +++ b/ILSpy/Analyzers/AnalyzerTreeView.cs @@ -29,6 +29,7 @@ using ICSharpCode.ILSpy.Docking; using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpyX; using ICSharpCode.ILSpy.Controls.TreeView; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpyX.TreeView; using TomsToolbox.Wpf.Composition.Mef; @@ -48,25 +49,21 @@ namespace ICSharpCode.ILSpy.Analyzers public AnalyzerTreeView() { this.ShowRoot = false; - this.Root = new AnalyzerRootNode { Language = MainWindow.Instance.CurrentLanguage }; this.BorderThickness = new Thickness(0); ContextMenuProvider.Add(this); - MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; - DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged; + MessageBus.Subscribers += (sender, e) => MainWindow_Instance_CurrentAssemblyListChanged(sender, e); + MessageBus.Subscribers += DockWorkspace_ActiveTabPageChanged; filterSettings = MainWindow.Instance.SessionSettings.FilterSettings; filterSettings.PropertyChanged += FilterSettings_PropertyChanged; } - private void DockWorkspace_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e) { - switch (e.PropertyName) - { - case nameof(DockWorkspace.Instance.ActiveTabPage): - filterSettings.PropertyChanged -= FilterSettings_PropertyChanged; - filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings; - filterSettings.PropertyChanged += FilterSettings_PropertyChanged; - break; - } + this.Root ??= new AnalyzerRootNode { Language = MainWindow.Instance.CurrentLanguage }; + + filterSettings.PropertyChanged -= FilterSettings_PropertyChanged; + filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings; + filterSettings.PropertyChanged += FilterSettings_PropertyChanged; } private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) diff --git a/ILSpy/Docking/DockWorkspace.cs b/ILSpy/Docking/DockWorkspace.cs index 2b1241e65..a1fcd68cd 100644 --- a/ILSpy/Docking/DockWorkspace.cs +++ b/ILSpy/Docking/DockWorkspace.cs @@ -36,23 +36,23 @@ using AvalonDock.Layout.Serialization; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.ILSpy.TextView; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpy.ViewModels; +using TomsToolbox.Wpf; + namespace ICSharpCode.ILSpy.Docking { - public class DockWorkspace : INotifyPropertyChanged, ILayoutUpdateStrategy + public class DockWorkspace : ObservableObject, ILayoutUpdateStrategy { private SessionSettings sessionSettings; - public event PropertyChangedEventHandler PropertyChanged; - - public static DockWorkspace Instance { get; private set; } + public static readonly DockWorkspace Instance = new(); - internal DockWorkspace(MainWindow parent) + private DockWorkspace() { - Instance = this; this.TabPages.CollectionChanged += Documents_CollectionChanged; - parent.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; + MessageBus.Subscribers += (sender, e) => MainWindow_Instance_CurrentAssemblyListChanged(sender, e); } private void MainWindow_Instance_CurrentAssemblyListChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -118,31 +118,31 @@ namespace ICSharpCode.ILSpy.Docking tool.IsVisible = false; } - private TabPageModel _activeTabPage = null; + private TabPageModel activeTabPage = null; public TabPageModel ActiveTabPage { get { - return _activeTabPage; + return activeTabPage; } set { - if (_activeTabPage != value) + if (!SetProperty(ref activeTabPage, value)) + { + return; + } + + var state = value.GetState(); + if (state != null) { - _activeTabPage = value; - var state = value.GetState(); - if (state != null) + if (state.DecompiledNodes != null) { - if (state.DecompiledNodes != null) - { - MainWindow.Instance.SelectNodes(state.DecompiledNodes, - inNewTabPage: false, setFocus: true, changingActiveTab: true); - } - else - { - MainWindow.Instance.NavigateTo(new RequestNavigateEventArgs(state.ViewedUri, null)); - } + MainWindow.Instance.SelectNodes(state.DecompiledNodes, + inNewTabPage: false, setFocus: true, changingActiveTab: true); + } + else + { + MainWindow.Instance.NavigateTo(new(state.ViewedUri, null)); } - - RaisePropertyChanged(nameof(ActiveTabPage)); } + MessageBus.Send(this, new DockWorkspaceActiveTabPageChangedEventArgs()); } } @@ -181,11 +181,6 @@ namespace ICSharpCode.ILSpy.Docking } } - protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - public void ShowText(AvalonEditTextOutput textOutput) { ActiveTabPage.ShowTextView(textView => textView.ShowText(textOutput)); diff --git a/ILSpy/Docking/ActiveTabPageConverter.cs b/ILSpy/Docking/TabPageGuardConverter.cs similarity index 73% rename from ILSpy/Docking/ActiveTabPageConverter.cs rename to ILSpy/Docking/TabPageGuardConverter.cs index 191a7088a..b6c2d2361 100644 --- a/ILSpy/Docking/ActiveTabPageConverter.cs +++ b/ILSpy/Docking/TabPageGuardConverter.cs @@ -21,24 +21,20 @@ using System.Windows.Data; using ICSharpCode.ILSpy.ViewModels; +using TomsToolbox.Wpf.Converters; + namespace ICSharpCode.ILSpy.Docking { - public class ActiveTabPageConverter : IValueConverter + public class TabPageGuardConverter : ValueConverter { - public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + protected override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - if (value is TabPageModel) - return value; - - return Binding.DoNothing; + return value is TabPageModel ? value : Binding.DoNothing; } - public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + protected override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - if (value is TabPageModel) - return value; - - return Binding.DoNothing; + return value is TabPageModel ? value : Binding.DoNothing; } } } diff --git a/ILSpy/MainWindow.xaml b/ILSpy/MainWindow.xaml index f2f4bac4f..411ff87b0 100644 --- a/ILSpy/MainWindow.xaml +++ b/ILSpy/MainWindow.xaml @@ -26,8 +26,6 @@ d:DataContext="{d:DesignInstance local:MainWindowViewModel}" > - - + @@ -109,12 +108,15 @@ Command="Search" Executed="SearchCommandExecuted" /> + + + @@ -207,6 +209,7 @@ ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Workspace.ActiveTabPage.FilterSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/> + @@ -231,7 +234,7 @@ DataContext="{Binding Workspace}" AnchorablesSource="{Binding ToolPanes}" DocumentsSource="{Binding TabPages}" - ActiveContent="{Binding ActiveTabPage, Mode=TwoWay, Converter={StaticResource ActiveTabPageConverter}}" + ActiveContent="{Binding ActiveTabPage, Mode=TwoWay, Converter={docking:TabPageGuardConverter}}" AllowMixedOrientation="True"> diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs index b6f92d433..b40d950a7 100644 --- a/ILSpy/MainWindow.xaml.cs +++ b/ILSpy/MainWindow.xaml.cs @@ -42,7 +42,6 @@ using ICSharpCode.Decompiler.Documentation; using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem.Implementation; -using ICSharpCode.ILSpy.Analyzers; using ICSharpCode.ILSpy.AppEnv; using ICSharpCode.ILSpy.Commands; using ICSharpCode.ILSpy.Docking; @@ -57,6 +56,7 @@ using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX.FileLoaders; using ICSharpCode.ILSpyX.Settings; using ICSharpCode.ILSpy.Controls.TreeView; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpyX.Extensions; using Microsoft.Win32; @@ -130,7 +130,7 @@ namespace ICSharpCode.ILSpy this.Icon = Images.ILSpyIcon; this.DataContext = new MainWindowViewModel { - Workspace = new DockWorkspace(this), + Workspace = DockWorkspace.Instance, SessionSettings = sessionSettings, AssemblyListManager = AssemblyListManager }; @@ -147,7 +147,7 @@ namespace ICSharpCode.ILSpy sessionSettings.PropertyChanged += SessionSettings_PropertyChanged; filterSettings = sessionSettings.FilterSettings; filterSettings.PropertyChanged += filterSettings_PropertyChanged; - DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged; + MessageBus.Subscribers += DockWorkspace_ActiveTabPageChanged; InitMainMenu(); InitWindowMenu(); InitToolbar(); @@ -157,25 +157,20 @@ namespace ICSharpCode.ILSpy this.Loaded += MainWindow_Loaded; } - private void DockWorkspace_PropertyChanged(object sender, PropertyChangedEventArgs e) + private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e) { - switch (e.PropertyName) - { - case nameof(DockWorkspace.Instance.ActiveTabPage): - DockWorkspace dock = DockWorkspace.Instance; - filterSettings.PropertyChanged -= filterSettings_PropertyChanged; - filterSettings = dock.ActiveTabPage.FilterSettings; - filterSettings.PropertyChanged += filterSettings_PropertyChanged; + DockWorkspace dock = DockWorkspace.Instance; + filterSettings.PropertyChanged -= filterSettings_PropertyChanged; + filterSettings = dock.ActiveTabPage.FilterSettings; + filterSettings.PropertyChanged += filterSettings_PropertyChanged; - var windowMenuItem = mainMenu.Items.OfType().First(m => (string)m.Tag == nameof(Properties.Resources._Window)); - foreach (MenuItem menuItem in windowMenuItem.Items.OfType()) - { - if (menuItem.IsCheckable && menuItem.Tag is TabPageModel) - { - menuItem.IsChecked = menuItem.Tag == dock.ActiveTabPage; - } - } - break; + var windowMenuItem = mainMenu.Items.OfType().First(m => (string)m.Tag == nameof(Properties.Resources._Window)); + foreach (MenuItem menuItem in windowMenuItem.Items.OfType()) + { + if (menuItem.IsCheckable && menuItem.Tag is TabPageModel) + { + menuItem.IsChecked = menuItem.Tag == dock.ActiveTabPage; + } } } @@ -359,7 +354,7 @@ namespace ICSharpCode.ILSpy #endregion #region Tool Pane extensibility - + private void InitToolPanes() { var toolPanes = App.ExportProvider.GetExportedValues("ToolPane"); @@ -632,8 +627,6 @@ namespace ICSharpCode.ILSpy get { return assemblyList; } } - public event NotifyCollectionChangedEventHandler CurrentAssemblyListChanged; - List commandLineLoadedAssemblies = new List(); internal async Task HandleSingleInstanceCommandLineArguments(string[] args) @@ -1038,7 +1031,8 @@ namespace ICSharpCode.ILSpy nd => nd.AncestorsAndSelf().OfType().Any( a => oldAssemblies.Contains(a.LoadedAssembly)))); } - CurrentAssemblyListChanged?.Invoke(this, e); + + MessageBus.Send(this, new CurrentAssemblyListChangedEventArgs(e)); } void LoadInitialAssemblies() @@ -1528,8 +1522,6 @@ namespace ICSharpCode.ILSpy public Language CurrentLanguage => DockWorkspace.Instance.ActiveTabPage.FilterSettings.Language; public LanguageVersion CurrentLanguageVersion => DockWorkspace.Instance.ActiveTabPage.FilterSettings.LanguageVersion; - public bool SupportsLanguageSwitching => DockWorkspace.Instance.ActiveTabPage.SupportsLanguageSwitching; - public event SelectionChangedEventHandler SelectionChanged; public IEnumerable SelectedNodes { diff --git a/ILSpy/Search/SearchPane.cs b/ILSpy/Search/SearchPane.cs index 7f920599f..e35a4da73 100644 --- a/ILSpy/Search/SearchPane.cs +++ b/ILSpy/Search/SearchPane.cs @@ -35,6 +35,7 @@ using System.Windows.Threading; using ICSharpCode.ILSpy.AppEnv; using ICSharpCode.ILSpy.Docking; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpyX; using ICSharpCode.ILSpyX.Extensions; @@ -82,7 +83,7 @@ namespace ICSharpCode.ILSpy.Search searchModeComboBox.Items.Add(new { Image = Images.Namespace, Name = "Namespace" }); ContextMenuProvider.Add(listBox); - MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged; + MessageBus.Subscribers += (sender, e) => MainWindow_Instance_CurrentAssemblyListChanged(sender, e); filterSettings = MainWindow.Instance.SessionSettings.FilterSettings; CompositionTarget.Rendering += UpdateResults; diff --git a/ILSpy/Util/MessageBus.cs b/ILSpy/Util/MessageBus.cs new file mode 100644 index 000000000..288f97227 --- /dev/null +++ b/ILSpy/Util/MessageBus.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Specialized; + +using TomsToolbox.Essentials; + +namespace ICSharpCode.ILSpy.Util +{ + public static class MessageBus + { + public static void Send(object sender, T e) + where T : EventArgs + { + MessageBus.Send(sender, e); + } + } + + /// + /// Simple, minimalistic message bus. + /// + /// The type of the message event arguments + public static class MessageBus + where T : EventArgs + { + private static readonly WeakEventSource Subscriptions = new(); + + public static event EventHandler Subscribers { + add => Subscriptions.Subscribe(value); + remove => Subscriptions.Unsubscribe(value); + } + + public static void Send(object sender, T e) + { + Subscriptions.Raise(sender, e); + } + } + + public abstract class WrappedEventArgs : EventArgs + { + private readonly T inner; + + protected WrappedEventArgs(T inner) + { + this.inner = inner; + } + + public static implicit operator T(WrappedEventArgs outer) + { + return outer.inner; + } + } + + public class CurrentAssemblyListChangedEventArgs(NotifyCollectionChangedEventArgs e) : WrappedEventArgs(e); + + public class DockWorkspaceActiveTabPageChangedEventArgs : EventArgs; +} \ No newline at end of file diff --git a/ILSpy/Views/DebugSteps.xaml.cs b/ILSpy/Views/DebugSteps.xaml.cs index 2c3e2e2e2..3b59c383f 100644 --- a/ILSpy/Views/DebugSteps.xaml.cs +++ b/ILSpy/Views/DebugSteps.xaml.cs @@ -8,6 +8,7 @@ using System.Windows.Input; using ICSharpCode.Decompiler.IL; using ICSharpCode.Decompiler.IL.Transforms; using ICSharpCode.ILSpy.Docking; +using ICSharpCode.ILSpy.Util; using ICSharpCode.ILSpy.ViewModels; using TomsToolbox.Wpf.Composition.Mef; @@ -35,7 +36,7 @@ namespace ICSharpCode.ILSpy InitializeComponent(); #if DEBUG - DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged; + MessageBus.Subscribers += DockWorkspace_ActiveTabPageChanged; filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings; filterSettings.PropertyChanged += FilterSettings_PropertyChanged; MainWindow.Instance.SelectionChanged += SelectionChanged; @@ -50,16 +51,11 @@ namespace ICSharpCode.ILSpy #endif } - private void DockWorkspace_PropertyChanged(object sender, PropertyChangedEventArgs e) + private void DockWorkspace_ActiveTabPageChanged(object sender, EventArgs e) { - switch (e.PropertyName) - { - case nameof(DockWorkspace.Instance.ActiveTabPage): - filterSettings.PropertyChanged -= FilterSettings_PropertyChanged; - filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings; - filterSettings.PropertyChanged += FilterSettings_PropertyChanged; - break; - } + filterSettings.PropertyChanged -= FilterSettings_PropertyChanged; + filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings; + filterSettings.PropertyChanged += FilterSettings_PropertyChanged; } private void WritingOptions_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)