diff --git a/ILSpy/Analyzers/AnalyzerTreeView.cs b/ILSpy/Analyzers/AnalyzerTreeView.cs
index b81763990..261e52b18 100644
--- a/ILSpy/Analyzers/AnalyzerTreeView.cs
+++ b/ILSpy/Analyzers/AnalyzerTreeView.cs
@@ -35,6 +35,8 @@ namespace ICSharpCode.ILSpy.Analyzers
///
public class AnalyzerTreeView : SharpTreeView
{
+ FilterSettings filterSettings;
+
public AnalyzerTreeView()
{
this.ShowRoot = false;
@@ -42,7 +44,21 @@ namespace ICSharpCode.ILSpy.Analyzers
this.BorderThickness = new Thickness(0);
ContextMenuProvider.Add(this);
MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged;
- MainWindow.Instance.SessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged;
+ DockWorkspace.Instance.PropertyChanged += DockWorkspace_PropertyChanged;
+ filterSettings = MainWindow.Instance.SessionSettings.FilterSettings;
+ filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
+ }
+
+ private void DockWorkspace_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ switch (e.PropertyName)
+ {
+ case nameof(DockWorkspace.Instance.ActiveTabPage):
+ filterSettings.PropertyChanged -= FilterSettings_PropertyChanged;
+ filterSettings = DockWorkspace.Instance.ActiveTabPage.FilterSettings;
+ filterSettings.PropertyChanged += FilterSettings_PropertyChanged;
+ break;
+ }
}
private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
diff --git a/ILSpy/Docking/DockWorkspace.cs b/ILSpy/Docking/DockWorkspace.cs
index ede66930e..19156ab79 100644
--- a/ILSpy/Docking/DockWorkspace.cs
+++ b/ILSpy/Docking/DockWorkspace.cs
@@ -94,8 +94,6 @@ namespace ICSharpCode.ILSpy.Docking
if (_activeTabPage != value)
{
_activeTabPage = value;
- this.sessionSettings.FilterSettings.Language = value.Language;
- this.sessionSettings.FilterSettings.LanguageVersion = value.LanguageVersion;
var state = value.GetState();
if (state != null)
{
@@ -173,23 +171,6 @@ namespace ICSharpCode.ILSpy.Docking
internal void LoadSettings(SessionSettings sessionSettings)
{
this.sessionSettings = sessionSettings;
- sessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged;
- }
-
- private void FilterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
- {
- if (e.PropertyName == "Language")
- {
- ActiveTabPage.Language = sessionSettings.FilterSettings.Language;
- if (sessionSettings.FilterSettings.Language.HasLanguageVersions)
- {
- sessionSettings.FilterSettings.LanguageVersion = ActiveTabPage.LanguageVersion;
- }
- }
- else if (e.PropertyName == "LanguageVersion")
- {
- ActiveTabPage.LanguageVersion = sessionSettings.FilterSettings.LanguageVersion;
- }
}
internal void CloseAllTabs()
diff --git a/ILSpy/FilterSettings.cs b/ILSpy/FilterSettings.cs
index 11930783e..cc0aa4b05 100644
--- a/ILSpy/FilterSettings.cs
+++ b/ILSpy/FilterSettings.cs
@@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
+using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
@@ -34,6 +35,13 @@ namespace ICSharpCode.ILSpy
///
public class FilterSettings : INotifyPropertyChanged
{
+ ///
+ /// This dictionary is necessary to remember language versions across language changes. For example,
+ /// the user first select C# 10, then switches to IL, then switches back to C#. After that we must be
+ /// able to restore the original selection (i.e., C# 10).
+ ///
+ private readonly Dictionary languageVersionHistory = new Dictionary();
+
public FilterSettings(XElement element)
{
this.ShowApiLevel = (ApiVisibility?)(int?)element.Element("ShowAPILevel") ?? ApiVisibility.PublicAndInternal;
@@ -146,8 +154,27 @@ namespace ICSharpCode.ILSpy
set {
if (language != value)
{
+ if (language != null && language.HasLanguageVersions)
+ {
+ languageVersionHistory[language] = languageVersion;
+ }
language = value;
OnPropertyChanged();
+ if (language.HasLanguageVersions)
+ {
+ if (languageVersionHistory.TryGetValue(value, out var version))
+ {
+ LanguageVersion = version;
+ }
+ else
+ {
+ LanguageVersion = Language.LanguageVersions.Last();
+ }
+ }
+ else
+ {
+ LanguageVersion = default;
+ }
}
}
}
@@ -167,6 +194,10 @@ namespace ICSharpCode.ILSpy
if (languageVersion != value)
{
languageVersion = value;
+ if (language.HasLanguageVersions)
+ {
+ languageVersionHistory[language] = languageVersion;
+ }
OnPropertyChanged();
}
}
diff --git a/ILSpy/MainWindow.xaml b/ILSpy/MainWindow.xaml
index 8a20d45cb..8fbdd7d58 100644
--- a/ILSpy/MainWindow.xaml
+++ b/ILSpy/MainWindow.xaml
@@ -19,7 +19,7 @@
xmlns:styles="urn:TomsToolbox.Wpf.Styles"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
xmlns:themes="clr-namespace:ICSharpCode.ILSpy.Themes"
- d:DataContext="{d:DesignInstance local:MainWindowDataContext}"
+ d:DataContext="{d:DesignInstance local:MainWindowViewModel}"
>
@@ -103,9 +103,9 @@