순서
I. Command Binding
II. Prism DelegateCommand
1. Create DelegateCommand
2. Create Call Function
I. Command Binding
UI에서 DataContext를 사용하여 해당 UI에 대한 이벤트 Command를
내부에서 구현한 함수로 Binding할 수 있다.
버튼 눌렀을 때의 Command를 각각 "OpenCommand", "ManualMoveCommand"로 Binding함.
일반적으로 Button Click시 함수와 연동 시켜주는데
MVVM 패턴으로 구조를 잡기 위해 객체에서 관리하도록 Binding을 해준다.
II. Prism DelegateCommand
: ViewModel은 명령 객체인 System.Window.input.ICommand로 구현할 수 있다.
: 이 ICommand를 통해 UI와 ViewModel과 코드 비하인드에서 상호작용 할 수 있다.
: Prism은 ICommand를 사용하여 구현된 인터페이스를 DelegateCommand로 제공하고 있다.
: 만약 Prism을 사용하지 않고 자체 Command를 구현하고자 한다면
System.Window.input.ICommand를 상속받는 임의의 Command 클래스를 생성하고
내부 추상 함수들을 구현해주면 된다.
-> 아래 DelegateCommandBase class도 그렇게 만들어 놓은 것이다.
class DelegateCommand : DelegateCommandBase {}
abstract class DegegateCommandBase : ICommand, IActiveAware
1. Create DelegateCommand
" public DelegateCommand myCommand {get; set; }"
"MainWindowViewModel.cs"
public class MainWindowViewModel : BindableBase {
// Delegate Command 생성
public DelegateCommand OpenCommand {get; set; }
public DelegateCommand ManualMoveCommand {get; set;}
public MainWindowViewModel( ... ) {
...
}
}
2. Create CallBackFunction
" myCommand = new DelegateCommand (myCallBackFunction); "
"MainWindowViewModel.cs"
public class MainWindowViewModel : BindableBase {
// Delegate Command 생성
public DelegateCommand OpenCommand {get; set; }
public DelegateCommand ManualMoveCommand {get; set;}
public MainWindowViewModel( ... ) {
...
OpenCommand = new DelegateCommand (processOpenCommand);
ManualMoveCommand = new DelegateCommand (processManualMoveCommand);
}
private void processOpenCommand () {}; // 구현1
private void processManualMoveCommand () {}; // 구현2
}
3. Raising Change Notifications
CallBack함수 구현부에서 내부 객체의 Property를 변경 했을 때
UI가 바로 반응하길 원하지만 그렇지 않다.
바뀐 정보를 Notify 해주어야 하는데 여러 구현 방식이 있다.
3.1 Using RaiseCanExecuteChanged()
: 바인딩 된 UI 요소의 상태를 수동으로 업데이트 할 때마다 사용
"RaiseCanExecuteChanged() 사용"
public DelegateCommand myCommand {get; set;}
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
SetProperty(ref _isEnabled, value);
myCommand .RaiseCanExecuteChanged(); // set 할 때 Notify
}
}
3.2 Using ObservesProperty()
: 속성 값이 변경될 때 마다 명령이 알림을 보내야 하는 경우 사용.
: 관찰 중인 속성 값이 변경될 때 4.1의 RaiseCanExecuteChanged()가 자동으로 호출된다.
: Chain으로 등록이 가능하다.
"ObservesProperty() 사용"
public DelegateCommand SubmitCommand {get; set;}
private bool _isEnabled;
public bool IsEnabled {
get { return _isEnabled; }
set { SetProperty(ref _isEnabled, value); }
}
public MainWindowViewModel() {
myCommand = new DelegateCommand(CallBackFunction);
myCommand.ObservesProperty( () => IsEnabled ); // 관찰 Property 등록
myCommand.ObservesProperty( () => otherProterty ); // Chaining 가능
}
3.3 Using ObservesCanExecute
: 속성 값이 단순 Boolean의 결과인 경우 사용한다.
: Chain으로 등록이 불가능하며 단 1개만 등록 가능하다.
: 등록된 속성 값이 변경 될 때 UI 알림 뿐 아니라 동일한 속성을 실제 Delegate로 사용한다 (?).
"ObservesCanExecute 사용"
public DelegateCommand SubmitCommand {get; set;}
private bool _isEnabled;
public bool IsEnabled {
get { return _isEnabled; }
set { SetProperty(ref _isEnabled, value); }
}
public MainWindowViewModel() {
myCommand = new DelegateCommand(CallBackFunction);
myCommand.ObservesCanExecute( () => IsEnabled ); // 관찰 Property 등록
}
'Programming > .NET(C#,WPF)' 카테고리의 다른 글
[Programmin][.NET] C# Canvas Drawing2 (Geometry class) (0) | 2023.03.17 |
---|---|
[Programmin][.NET] C# Canvas Drawing1 (Shape class) (0) | 2023.03.13 |
[Programming][.NET] Prism Library Event 사용법 (0) | 2023.02.11 |
[Programming][C#] 문법 13. Event (0) | 2023.01.26 |