2010-06-21 4 views
0

원하는 것은 다른 탭에 다른 바인딩을 사용했기 때문에 탭을 전환하면 명령 가용성이 토글됩니다. CommandBindings가 그런 식으로 일한다고 생각했습니다.WPF CommandBinding 최상위 항목에 없음/Window/this

그러나이 간단한 샘플을 얻으려고 노력하면서 마지막으로 보냈습니다. 내가 근본적으로 오해하고 (또는 처음이 아닐 수도) 또는 뭔가 잘못되었습니다.

CommandBinding을 textBoxA에 추가하지만 textBoxB에는 추가하지 않습니다. 두 명령 사이를 이동하면 해당 명령에 설정된 버튼을 활성화 및 비활성화해야합니다.

CommandBinding을 창에 추가하면 버튼이 제대로 작동하지만 항목 별 CommandBindings의 전체 지점이 삭제됩니다.

public MainWindow() 
{ 
    InitializeComponent(); 

    button1.Command = ApplicationCommands.Open; 

    var _Binding = new CommandBinding(button1.Command); 
    textBoxA.CommandBindings.Add(_Binding); 
    textBoxB.CommandBindings.Clear(); // nothing bound 

    _Binding.CanExecute += (s, e) => 
    { 
     e.CanExecute = true; 
    }; 

    _Binding.Executed += (s, e) => 
    { 
     MessageBox.Show("Hello"); 
    }; 
} 

버튼을 사용하면 하나의 텍스트 상자에서 이동하면서도, 장애인 유지 (이 코드를하려고하면) 당신은 볼 뒤에이 코드를 사용하여이 XAML

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="500"> 
    <Canvas> 
     <Button Canvas.Left="31" Canvas.Top="24" Content="Click Me" Name="button1" Width="100"/> 
     <TextBox Canvas.Left="155" Canvas.Top="22" Height="23" Name="textBoxA" Width="120" Text="A" /> 
     <TextBox Canvas.Left="298" Canvas.Top="22" Height="23" Name="textBoxB" Width="120" Text="B" /> 
    </Canvas> 
</Window> 

를 사용

다른 하나. (비록 단추의 CommandBinding을 구현하기 때문에 textBoxA가 단추를 활성화해야 함에도 불구하고).

어떻게 작동하나요?

미리 감사드립니다.

+0

을했다 : http://stackoverflow.com/questions/3339257/wpf-routed-command-with-bindings -per-tab –

답변

0

이것이 작동하는 방법을 알 수 없으며 요점을 놓치고있는 것처럼 보입니다. (미안) CommandBindings는 부모 요소에 적용될 예정입니다. 캔버스에 적용해도됩니다. 버튼을 클릭하면 RoutedCommand가 시각적 트리를 통해 '거품을 띄울'수 있습니다. 즉, 부모 요소가이 명령에 바인딩 된 이벤트를 발생시킵니다. 단추가 비활성화 된 상태로 유지되는 이유는 해당 지점에서 열기 명령을 실행할 수 없으며 실행 경로에 없기 때문에 CommandBinding이 평가되지 않기 때문입니다. 여기 참조 :

<Canvas> 
    <Button ... Command="Open"> 
     <CommandBindings> 
      <CommandBinding Command="Open" Executed="OnOpen"/> 
     <CommandBindings> 
    </Button> 
    <TextBox ... > 
     <CommandBindings> 
      <CommandBinding Command="Open" Executed="OnOpen"/> 
     <CommandBindings> 
    </TextBox> 
    <TextBox ... /> 
</Canvas> 

과의

은 코드 숨김이 :

private void OnOpen(object sender, ExecutedRoutedEventArgs e) 
{ 
    MessageBox.Show("Hello"); 
} 

있는 CommandBindings에 대한 아이디어입니다 내가 당신의 시나리오를 칠 수 있다면

http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

+0

여기 (http://stackoverflow.com/questions/1375483/wpf-textbox-interceping-routeduicommands) 보면 WPF에 텍스트 상자 (및 다른 컨트롤)의 기본 바인딩이 있음을 보여줍니다.복사/붙여 넣기 (예 :)가 텍스트 상자에 대해 기본값임을 알고 있습니다. 캔버스와 같은 상위 컨트롤과 같이 예를 들어, 텍스트 상자에 내가 제안한 것을 수행 할 수없는 경우 CommandBindings 컬렉션 속성이있는 이유는 무엇입니까? (BTW, 답장을 보내 주셔서 감사합니다) 또한 캔버스 설정 (두 경우) 내 샘플과 같은 문제가 있습니다. –

+0

내가 아는 한 CommandBinding의 목적은 아래쪽 요소에서 명령이 실행될 때 트리 위쪽에서 수신 및 실행되도록 허용하는 것입니다. 텍스트 상자는 CommandBindings 속성을 갖기 때문에 UIElement이고 아무런 문제없이 실제로 단추를 텍스트 상자 안에 넣을 수 있습니다. 그런 다음 button 명령 이벤트를 선택합니다. –

0

내가 볼하려고합니다 일반적으로 컨텍스트 내에서 버튼과 다른 컨트롤 (일반적으로 사용자 정의 컨트롤)에서 공통적 인 키 스트로크가 작동하는 지름길입니다. 그런 다음 각 영역은 열기 명령에 대해 다른 의미를 가질 수 있습니다 (하나는 파일을 열 것입니다 - 다른 곳에서는 ListView에서 선택된 항목을 열 것입니다).

예를 들어, TextBox A 나 버튼에 포커스가있는 동안 Ctrl + O를 누르면 'Hello'MessageBox가 트리거됩니다. 그러나 더 깊은 설명을 위해 링크 된 Leom 페이지를 읽으십시오.

+0

감사합니다. 그래서, 내 다음 질문은 내가 열기 명령을 사용하려면, 나는 TextBoxA에 CommandBinding (예 : OnOpen1())과 TextBoxB에있을 때 다른 CommandBinding (예 : OnOpen2())을 원한다. 그리고, TextBoxC에 있으면 버튼을 비활성화하고 싶습니다. 자신과 마찬가지로 직접 구현하면 정상적으로 작동합니다. 나는 그것을 깨닫는다. –

+0

그런 다음 문제의 CommandBinding의 Execute 부분 만 교환하면됩니다. 따라서 TextBoxA 용 Eventhandler와 TextBoxB 용 Eventhandler 중 하나입니다. 그러나 단추에 대한 명령 바인딩을 제거해야합니다. 그러면 논리적 포커스에서 VisualTree에서 '가장 가까운'CommandBinding에 응답하므로 모두 작동해야합니다. - (TextBoxA의 명령 바인딩은 TextBoxA에 있고 TextBoxB는있는 경우 거기 등). – Goblin