문제

내가 이해 한 바에 따르면 명령 패턴의 목표는 UI 상호 작용을 응용 프로그램 로직과 분리하는 것입니다. 올바르게 구현 된 명령을 사용하면 "인쇄"메뉴 항목을 클릭하면 다음과 같은 상호 작용이 발생할 수 있습니다.

(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)

이렇게하면 UI를 응용 프로그램 로직과 분리하는 것이 좋습니다.

나는 WPF 명령을보고 있었고, 대부분이 패턴을 구현 한 방법을 봅니다. 그러나 나는 그들이 어느 정도까지 느낀다. 복잡한 명령 패턴은 UI를 애플리케이션 로직에서 분리하는 것을 방해하지 않는 방식으로 구현할 수있었습니다.

예를 들어, 텍스트 상자에 텍스트를 붙여 넣는 버튼이있는이 간단한 WPF 창을 고려하십시오.

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Paste"
                        Executed="CommandBinding_Executed"/>
    </Window.CommandBindings>
    <StackPanel>
        <TextBox x:Name="txtData" />
        <Button Command="Paste" Content="Paste" />
    </StackPanel>
</Window>

코드-홀드는 다음과 같습니다.

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            ApplicationCommands.Paste.Execute(null, txtData);
        }
    }
} 

명령에서 무엇을 얻었습니까? 명령 바인딩 이벤트 핸들러에서 코드를 쉽게 넣을 수있는 것 같습니다. Click 이벤트. 물론, 이제 여러 UI 요소를 페이스트 명령과 연결할 수 있으며 하나의 이벤트 핸들러 만 사용하면되지만 여러 텍스트 상자에 붙여 넣으려면 어떻게해야합니까? 이벤트 핸들러 로직을 더 복잡하게 만들거나 더 많은 이벤트 처리기를 작성해야합니다. 그래서 지금, 나는 이것을 가지고 있다고 생각합니다.

(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|

내가 여기서 무엇을 놓치고 있습니까? 그것은 나에게 간접의 여분의 층처럼 보인다.

도움이 되었습니까?

해결책

이미 언급 된 것 외에도 특정 페이스트 예제에서 잊어 버린 것은 CommandTarget 및 CommandParameter 속성입니다. 페이스트의 경우 CommandTarget으로 설정하여 텍스트 상자를 지정할 수 있습니다.

이러한 속성은 다른 컨트롤에서 동일한 라우팅 명령을 사용하려는 경우 절대적으로 필수적입니다. 이를 통해 실행 된 핸들러에게 명령이 호출되는 컨텍스트에 대한 정보를 제공 할 수 있습니다.

다른 팁

당신은 혼란 스러울 수 있습니다.

그만큼 ICommand 인터페이스는 명령 패턴을 지원합니다. 이를 통해 사용자 작업을 재사용 가능한 클래스로 추상화 할 수 있습니다.

라우팅 된 명령은 특정 구현입니다 ICommand 핸들러를위한 시각적 트리를 통해 그 검색. 이들은 많은 다른 컨트롤에서 구현할 수있는 명령에 특히 유용하며 현재 컨트롤이이를 처리하기를 원합니다. 사본/페이스트를 생각하십시오. 이를 처리 할 수있는 많은 컨트롤이있을 수 있지만, 라우팅 된 명령을 사용함으로써 라우팅 된 명령 시스템은 초점을 기반으로 명령을 처리하기 위해 올바른 컨트롤을 자동으로 찾습니다.

제어 할 때 RoutedCommands 및 Routeduicommand를 사용하는 것이 좋습니다. 예를 들어 Textbox는 귀하를위한 비공식 공무원을 구현하고 입력 가스가 이미 Ctrl 키+. 그러나보기 모델을 구축 할 때, 내 선호는 Execute 및 CanExecute의 내부 구현이있는 사용자 정의 ICOMMAND를 선호합니다. DelegateCommand는이를 프리즘으로 제공합니다. 이를 통해 View/XAML 디자이너는 명령에 대해서만 걱정할 수 있으며 올바른 Execute/CanExecute 처리자가 아닙니다. 이것은보다 표현적인보기 모델을 허용합니다.

추신. 대의원 명령은 아직 입력 결합과 함께 작동하지 않습니다 (우아하게). Microsoft에서 하나를 고칠 수 있습니까?

그들은 어떤 것들에 대해 과잉이 될 수 있지만, 명령을 사용할 수 없을 때 (예 : 텍스트를 선택하지 않은 등) 자동으로 버튼/메뉴 항목을 자동으로 활성화/비활성화 할 수있는 Canexecute와 같은 멋진 이점을 얻을 수 있습니다. 코드를 사용하지 않고 블렌드에서 명령을 할 수도 있습니다. 이는 디자이너에게 적합합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top