@@ -70,7 +70,15 @@ public partial class {className} : BaseViewModel
7070 var fieldType = field . Type . ToDisplayString ( ) ;
7171 var fieldName = ToPascal ( field . Name ) ;
7272
73- viewModelBuilder . AppendLine ( $ " public { fieldType } { fieldName } {{ get => { field . Name } ; set => SetProperty(ref { field . Name } , value); }}") ;
73+ viewModelBuilder . AppendLine (
74+ $@ " public { fieldType } { fieldName } {{ get => { field . Name } ; set
75+ {{
76+ SetProperty(ref { field . Name } , value);" ) ;
77+
78+ var onChange = GetOnChangeMethodName ( field ) ;
79+ if ( ! string . IsNullOrWhiteSpace ( onChange ) )
80+ viewModelBuilder . AppendLine ( $ " { onChange } ();") ;
81+ viewModelBuilder . AppendLine ( " }" ) ;
7482 }
7583
7684 foreach ( var method in commandMethods )
@@ -101,10 +109,12 @@ public override void Execute(object? parameter)
101109 {{
102110 vm.{ method . Name } ();
103111 }}
104- }}
105- }}
106112" ) ;
107-
113+ var canExecute = GetCanExecuteMethodName ( method ) ;
114+ if ( ! string . IsNullOrWhiteSpace ( canExecute ) )
115+ viewModelBuilder . AppendLine ( $ " public override bool CanExecute(object? parameter) => vm.{ canExecute } ();") ;
116+ viewModelBuilder . AppendLine ( " }" ) ;
117+ viewModelBuilder . AppendLine ( "}" ) ;
108118 spc . AddSource ( $ "{ commandClassName } .g.cs", SourceText . From ( commandBuilder . ToString ( ) , Encoding . UTF8 ) ) ;
109119 }
110120
@@ -122,4 +132,18 @@ private static string ToPascal(string name)
122132 if ( name . StartsWith ( "_" ) ) name = name . TrimStart ( '_' ) ;
123133 return char . ToUpperInvariant ( name [ 0 ] ) + name . Substring ( 1 ) ;
124134 }
135+
136+ private static string ? GetCanExecuteMethodName ( IMethodSymbol method )
137+ {
138+ var attribute = method . GetAttributes ( ) . First ( x => x . AttributeClass ? . Name == "CommandAttribute" ) ;
139+ var argument = attribute . NamedArguments . First ( arg => arg . Key == "CanExecuteMethodName" ) ;
140+ return argument . Value . Value ? . ToString ( ) ;
141+ }
142+
143+ private static string ? GetOnChangeMethodName ( IFieldSymbol field )
144+ {
145+ var attribute = field . GetAttributes ( ) . First ( x => x . AttributeClass ? . Name == "BindAttribute" ) ;
146+ var argument = attribute . NamedArguments . First ( arg => arg . Key == "OnChangeMethodName" ) ;
147+ return argument . Value . Value ? . ToString ( ) ;
148+ }
125149}
0 commit comments