순서

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 등록
}
 

 

+ Recent posts