diff --git a/src/CosmosDbExplorer/CosmosDbExplorer.csproj b/src/CosmosDbExplorer/CosmosDbExplorer.csproj
index 824d106..f693e76 100644
--- a/src/CosmosDbExplorer/CosmosDbExplorer.csproj
+++ b/src/CosmosDbExplorer/CosmosDbExplorer.csproj
@@ -128,6 +128,7 @@
+
diff --git a/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs b/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs
index e156f35..a2c2898 100644
--- a/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs
+++ b/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs
@@ -5,6 +5,8 @@
using CosmosDbExplorer.Messages;
using GalaSoft.MvvmLight.Threading;
using CosmosDbExplorer.ViewModel;
+using CosmosDbExplorer.Infrastructure;
+using System.Collections.Generic;
namespace CosmosDbExplorer.Infrastructure.Models
{
@@ -22,9 +24,9 @@ public interface ITreeViewItemViewModel
/// Base class for all ViewModel classes displayed by TreeViewItems.
/// This acts as an adapter between a raw data object and a TreeViewItem.
///
- public class TreeViewItemViewModel : ObservableObject
+ public abstract class TreeViewItemViewModel : ObservableObject
{
- private static readonly TreeViewItemViewModel DummyChild = new TreeViewItemViewModel();
+ private static readonly TreeViewItemViewModel DummyChild = new TreeViewItemViewModelDummy();
private bool _isExpanded;
@@ -32,7 +34,7 @@ protected TreeViewItemViewModel(TreeViewItemViewModel parent, IMessenger messeng
{
Parent = parent;
MessengerInstance = messenger;
- Children = new ObservableCollection();
+ Children = new SortedObservableCollection(Comparer);
messenger.Register(this, OnRemoveNodeMessage);
@@ -61,7 +63,7 @@ private TreeViewItemViewModel()
///
/// Returns the logical child items of this object.
///
- public ObservableCollection Children { get; }
+ public SortedObservableCollection Children { get; }
///
/// Returns true if this object's Children have not yet been populated.
@@ -126,9 +128,28 @@ protected virtual Task LoadChildren()
public TreeViewItemViewModel Parent { get; }
public IMessenger MessengerInstance { get; }
+
+ private static readonly IComparer Comparer = new TreeViewItemViewModelComparer();
+
+ public abstract string Name { get; }
+
+ private class TreeViewItemViewModelDummy
+ : TreeViewItemViewModel
+ {
+ public override string Name => string.Empty;
+ }
+ }
+
+ public class TreeViewItemViewModelComparer
+ : IComparer
+ {
+ int IComparer.Compare(TreeViewItemViewModel x, TreeViewItemViewModel y)
+ {
+ return string.Compare(x.Name, y.Name);
+ }
}
- public class TreeViewItemViewModel : TreeViewItemViewModel
+ public abstract class TreeViewItemViewModel : TreeViewItemViewModel
where TParent : TreeViewItemViewModel
{
public TreeViewItemViewModel(TParent parent, IMessenger messenger, bool lazyLoadChildren)
diff --git a/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs b/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs
new file mode 100644
index 0000000..1282690
--- /dev/null
+++ b/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs
@@ -0,0 +1,41 @@
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace CosmosDbExplorer.Infrastructure
+{
+ public class SortedObservableCollection
+ : ObservableCollection
+ {
+ private readonly IComparer _comparer;
+
+ public SortedObservableCollection(IComparer comparer)
+ {
+ _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer));
+ }
+
+ public SortedObservableCollection(IEnumerable collection, IComparer comparer)
+ : base(collection)
+ {
+ _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer));
+ }
+
+ public SortedObservableCollection(List list, IComparer comparer)
+ : base(list)
+ {
+ _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer));
+ }
+
+ protected override void InsertItem(int index, TValue item)
+ {
+ index = this.TakeWhile(i => _comparer.Compare(item, i) > 0).Count();
+ base.InsertItem(index, item);
+ }
+
+ protected override void SetItem(int index, TValue item)
+ {
+ RemoveAt(index);
+ InsertItem(default, item);
+ }
+ }
+}
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs
index 4527126..cef0e45 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs
@@ -1,14 +1,10 @@
-using System;
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using System.Windows.Media;
using CosmosDbExplorer.Infrastructure;
using CosmosDbExplorer.Infrastructure.Models;
using CosmosDbExplorer.Messages;
using CosmosDbExplorer.Services;
using GalaSoft.MvvmLight.Ioc;
-using GalaSoft.MvvmLight.Messaging;
-using GalaSoft.MvvmLight.Threading;
using Microsoft.Azure.Documents;
namespace CosmosDbExplorer.ViewModel
@@ -25,8 +21,6 @@ protected AssetRootNodeViewModelBase(CollectionNodeViewModel parent)
MessengerInstance.Register>(this, InnerOnUpdateOrCreateNodeMessage);
}
- public string Name { get; protected set; }
-
public new CollectionNodeViewModel Parent
{
get { return base.Parent; }
@@ -72,7 +66,7 @@ protected AssetNodeViewModelBase(TParent parent, TResource resource)
Resource = resource;
}
- public string Name => Resource.Id;
+ public override string Name => Resource.Id;
public string ContentId => Resource.AltLink;
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs
index f471c66..7f1af28 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs
@@ -13,10 +13,9 @@ public class CollectionMetricsNodeViewModel : TreeViewItemViewModel "Collection Metrics";
public RelayCommand OpenCommand
{
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs
index 99b4f18..0a92739 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs
@@ -34,7 +34,7 @@ public ConnectionNodeViewModel(IDocumentDbService dbService, IMessenger messenge
public List Databases { get; protected set; }
- public string Name => Connection.DatabaseUri.ToString();
+ public override string Name => Connection.DatabaseUri.ToString();
protected override async Task LoadChildren()
{
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs
index 62b5261..8340790 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs
@@ -12,10 +12,9 @@ public class DocumentNodeViewModel : TreeViewItemViewModel "Documents";
public RelayCommand OpenDocumentCommand
{
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs
index 519cfb7..d9a9ea1 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs
@@ -18,7 +18,7 @@ public PermissionNodeViewModel(Permission permission, UserNodeViewModel parent)
public Permission Permission { get; set; }
- public string Name => Permission?.Id;
+ public override string Name => Permission?.Id;
public string ContentId => Permission?.AltLink ?? "NewPermission";
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs
index 4fd7b21..bd9ecce 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs
@@ -23,7 +23,7 @@ protected ResourceNodeViewModelBase(Resource resource, TParent parent, bool lazy
Resource = resource;
}
- public string Name => Resource.Id;
+ public override string Name => Resource.Id;
public RelayCommand RefreshCommand
{
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs
index 63f7e53..1468ad0 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs
@@ -11,10 +11,9 @@ public class ScaleSettingsNodeViewModel : TreeViewItemViewModel "Scale & Settings";
public string ContentId => Parent.Collection.SelfLink + "/ScaleSettings";
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs
index 5f6fe29..d781e1c 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs
@@ -11,9 +11,10 @@ public class StoredProcedureRootNodeViewModel : AssetRootNodeViewModelBase "Stored Procedures";
+
protected override async Task LoadChildren()
{
IsLoading = true;
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs
index fbbe317..82ef731 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs
@@ -11,8 +11,9 @@ public class TriggerRootNodeViewModel : AssetRootNodeViewModelBase
public TriggerRootNodeViewModel(CollectionNodeViewModel parent)
: base(parent)
{
- Name = "Triggers";
}
+
+ public override string Name => "Triggers";
protected override async Task LoadChildren()
{
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs
index 757cff3..94ef307 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs
@@ -11,9 +11,10 @@ public class UserDefFuncRootNodeViewModel : AssetRootNodeViewModelBase "User Defined Functions";
+
protected override async Task LoadChildren()
{
IsLoading = true;
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs
index e4a23c9..68f6b70 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs
@@ -25,7 +25,7 @@ public UserNodeViewModel(User user, UsersNodeViewModel parent)
_dbService = SimpleIoc.Default.GetInstance();
}
- public string Name => User.Id;
+ public override string Name => User.Id;
public string ContentId => User.AltLink ?? "NewUser";
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs
index 4c221d2..934f675 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs
@@ -19,13 +19,12 @@ public class UsersNodeViewModel : TreeViewItemViewModel,
public UsersNodeViewModel(Database database, DatabaseNodeViewModel parent)
: base(parent, parent.MessengerInstance, true)
{
- Name = "Users";
Database = database;
_parent = parent;
_dbService = SimpleIoc.Default.GetInstance();
}
- public string Name { get; set; }
+ public override string Name => "Users";
public Database Database { get; }
diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs
index bb7ce65..3bd9d73 100644
--- a/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs
+++ b/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs
@@ -46,7 +46,7 @@ public async Task LoadNodesAsync()
connection.Connection = c.Value;
return connection;
- });
+ }).OrderBy(c => c.Name);
Nodes = new ObservableCollection(nodes);
}
diff --git a/src/CosmosDbExplorer/Views/QueryEditorView.xaml b/src/CosmosDbExplorer/Views/QueryEditorView.xaml
index ed254e9..5581b3b 100644
--- a/src/CosmosDbExplorer/Views/QueryEditorView.xaml
+++ b/src/CosmosDbExplorer/Views/QueryEditorView.xaml
@@ -36,7 +36,9 @@
Document="{Binding Content, UpdateSourceTrigger=PropertyChanged}"
IsModified="{Binding IsDirty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
-
+
+
+