@@ -15,9 +15,6 @@ public partial class SnippetViewModel : ObservableObject, IDataErrorInfo
1515 [ ObservableProperty ]
1616 private ObservableCollection < Language > _languages = [ ] ;
1717
18- [ ObservableProperty ]
19- private ObservableCollection < Category > _categories = [ ] ;
20-
2118 [ ObservableProperty ]
2219 private ObservableCollection < Category > _availableCategories = [ ] ;
2320
@@ -36,6 +33,7 @@ public partial class SnippetViewModel : ObservableObject, IDataErrorInfo
3633 private string ? _selectedLanguageName ;
3734
3835 [ ObservableProperty ]
36+ [ NotifyCanExecuteChangedFor ( nameof ( SaveCommand ) ) ]
3937 private string ? _title = string . Empty ;
4038
4139 public string Error => "" ;
@@ -44,10 +42,9 @@ public string this[string _property]
4442 {
4543 get
4644 {
47- if ( _property == nameof ( Title ) )
45+ if ( _property == nameof ( Title ) && string . IsNullOrWhiteSpace ( Title ) )
4846 {
49- if ( string . IsNullOrWhiteSpace ( Title ) )
50- return "Title cannot be empty" ;
47+ return "Title cannot be empty" ;
5148 }
5249 return "" ;
5350 }
@@ -57,7 +54,8 @@ public SnippetViewModel(
5754 bool isEditMode ,
5855 Snippet ? snippet ,
5956 List < Language > ? languages ,
60- DatabaseService ? databaseService )
57+ DatabaseService ? databaseService ,
58+ Category ? preselectedCategory = null )
6159 {
6260 ArgumentNullException . ThrowIfNull ( databaseService ) ;
6361
@@ -67,12 +65,19 @@ public SnippetViewModel(
6765 Languages = new ObservableCollection < Language > ( languages ?? new List < Language > ( ) ) ;
6866 Snippet = snippet ;
6967
68+ if ( preselectedCategory != null )
69+ {
70+ SelectedCategory = preselectedCategory ;
71+ }
72+
7073 InitializeSelections ( ) ;
7174 }
7275
7376 public bool CanSave ( )
7477 {
75- return string . IsNullOrWhiteSpace ( this [ nameof ( Title ) ] ) ;
78+ // The command can be executed if there are no validation errors for the Title
79+ // and a category is selected.
80+ return string . IsNullOrEmpty ( this [ nameof ( Title ) ] ) && SelectedCategory != null ;
7681 }
7782
7883 private void InitializeSelections ( )
@@ -86,9 +91,17 @@ private void InitializeSelections()
8691 }
8792 else
8893 {
89- SelectedLanguage = Languages . FirstOrDefault ( ) ;
90- AvailableCategories = new ObservableCollection < Category > ( SelectedLanguage ? . Categories ?? [ ] ) ;
91- SelectedCategory = AvailableCategories . FirstOrDefault ( ) ;
94+ if ( SelectedCategory != null ) // A category was pre-selected
95+ {
96+ SelectedLanguage = SelectedCategory . Language ;
97+ AvailableCategories = new ObservableCollection < Category > ( SelectedLanguage ? . Categories ?? [ ] ) ;
98+ }
99+ else // No pre-selection, start from scratch
100+ {
101+ SelectedLanguage = Languages . FirstOrDefault ( ) ;
102+ AvailableCategories = new ObservableCollection < Category > ( SelectedLanguage ? . Categories ?? [ ] ) ;
103+ SelectedCategory = AvailableCategories . FirstOrDefault ( ) ;
104+ }
92105 }
93106 }
94107
@@ -97,7 +110,7 @@ partial void OnSelectedLanguageChanged(Language? value)
97110 AvailableCategories = new ObservableCollection < Category > ( value ? . Categories ?? new ObservableCollection < Category > ( ) ) ;
98111 SelectedLanguageName = value ? . Name ;
99112
100- if ( ! IsEditMode )
113+ if ( ! IsEditMode && SelectedCategory == null )
101114 SelectedCategory = AvailableCategories . FirstOrDefault ( ) ;
102115 }
103116
@@ -110,14 +123,11 @@ partial void OnSelectedCategoryChanged(Category? value)
110123 }
111124 }
112125
113- [ RelayCommand ]
126+ [ RelayCommand ( CanExecute = nameof ( CanSave ) ) ]
114127 private void Save ( )
115128 {
116129 try
117130 {
118- if ( ! CanSave ( ) )
119- return ;
120-
121131 if ( SelectedLanguage != null && SelectedCategory != null && Snippet != null )
122132 {
123133 Snippet . Title = Title ?? string . Empty ;
0 commit comments