상세 컨텐츠

본문 제목

[WPF] Command

똑똑한 개발/C#

by 성댕쓰 2022. 4. 20. 12:51

본문

Comamnd 란?

WPF의 input 매커니즘 중 하나.

사용하는 이유

다음 두 개를 분리하기 위해 사용.

  • command 발생시키는 object
  • command 실행하는 logic

Action 실행가능한지 확인하기 위해 사용.

  • ex. CanExcute, CanExcuteChaged

4가지 main concept

command, command source, command target, command binding이 command를 구성한다.

  • command는 실행할 액션.
  • command source는 command를 호출할 object.
  • command target은 action 목적지.
  • command binding은 command와 command logic의 연결.
<StackPanel>
    <Menu>
        <MenuItem Command="ApplicationCommands.Paste"/>
    </Menu>
    <TextBox/>
</StackPanel>
  • command : paste
  • command source : menuItem
  • command target : textbox
  • command binding : textbox support

주의할 점 : command target control이 항상 comamnd binding을 지원하는 것은 아니다. 보통 개발자가 구현해야 함.

Command

WPF IComamnd interface를 구현하여 만든다.
ICommand는 다음 2개 메서드와 1개 이벤트 인터페이스를 갖고 있다.

  • Execute
  • CanExecute
  • CanExecuteChanged

Execute는 command와 관련한 action을 수행한다.
CanExecute는 현재 command target에 command 수행할 수 있는지 조사하여 결과를 리턴한다.
CanExecuteChanged는 변화가 있는 command source를 탐지하고 comamnd가 아직 실행되기 전에 불린다.

RoutedCommand 자체는 application logic을 갖고 있지 않다. 대신 routed event를 발생시키고 element tree를 따라 CommanddBinding을 만날때까지 이 이벤트를 전파한다.
CommandBinding은 이벤트 핸들러를 갖고 있다.

Comamnd Sources

command를 발생시키는 object이다. object는 일반적으로 ICommandSource interface를 구현한다.
ICommandSource interface는 다음과 같다.

  • Command
    object가 발생시킬 command
  • CommandTarget
    command가 작용할 object
    CommandTarget은 오직 ICommand가 RoutedCommand일 때만 작동함.
    만약 command가 RoutedCommand가 아니면 CommandTarget은 무시된다.
    CommandTarget을 적용하지 않으면, keyboard focus를 가진 element가 ComamndTarget이 된다.
  • CommandParameter
    user-defined data type. Command 구현한 핸들러에게 넘겨준다.

InputGesture는 comamnd와 어떤 동작을 연결한다.
InputGesture는 command source에 적용한다. wpf inputgesture에는 다음 두 가지가 있다.

  • KeyGesture
  • MouseGesture
<Window.InputBindings>
  <KeyBinding Key="B"
              Modifiers="Control" 
              Command="ApplicationCommands.Open" />
</Window.InputBindings>

이 외 다른 방법도 있다. 공식문서 참조

CommandBinding

CommandBinding은 command와 command를 구현하는 이벤트 핸들러를 연결한다. 다음의 구성요소를 갖고 있다.

  • Command Property
    CommandBinding과 연결할 Comamnd
  • PreviewExecuted event
    command logic을 구현
  • Executed event
    command logic을 구현
  • PreviewExecuted event Command가 동작할 수 있는지 결정
  • CanExecute event
    Command가 동작할 수 있는지 결정

Command Target

command가 동작할 element. ICommandSource의 CommandTarget은 ICommand가 RoutedCommand 일 때만 사용가능하다.

<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
                Executed="OpenCmdExecuted"
                CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
<Grid>
<StackPanel>
    <Button Name="pasteBtn"
            Width ="50" 
            Command="ApplicationCommands.Open">paste</Button>
</StackPanel>
</Grid>
private void OpenCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string command, targetobj;
    command = ((RoutedCommand)e.Command).Name;
    targetobj = ((FrameworkElement)e.Source).Name;
    MessageBox.Show("The " + command + " command has benn invoked on target object " + targetobj);
}

private void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

 

참조 : Commanding Overview - WPF .NET Framework | Microsoft Docs

'똑똑한 개발 > C#' 카테고리의 다른 글

생성자에서 가상함수 부르면 안되는 이유  (0) 2022.06.15
[WPF] Dependency Property Metadata  (0) 2022.04.19
[WPF] Databinding  (0) 2022.04.18
[WPF] Pack uri  (0) 2022.04.15
c# (WPF) Data Binding 에 대해서  (0) 2021.05.31

관련글 더보기

댓글 영역