2010-05-10 2 views
0

구현 된 리본에 단추가있어 명령 바인딩에 문제가 있습니다. 리본은 AppRibbon이라는 UserControl에 있습니다. AppRibon 컨트롤에는 RenameModuleCmd라는 속성이있는 SelectedModule이라는 공용 속성이 있습니다. 단추에 대한 이벤트 처리기를 만들면 명령을 명시 적으로 호출하여 아래와 같이 모든 작업이 제대로 작동하는지 확인합니다.WPF의 단추에 문제가있는 바인딩 명령

public partial class ApplicationRibbon : UserControl { 
    public ApplicationRibbon() { 
     InitializeComponent(); 
    } 

    public ModuleViewModel SelectedModule { get; set; } 

    private void ButtonTool_Click(object sender, RoutedEventArgs e) { 
     SelectedModule.RenameModuleCmd.Execute(null); 
    } 
    } 

이 작업은 정상적으로 작동합니다. 하지만 분명히 모델 뒤에있는 코드를 사용하고 싶지는 않습니다 ... 오히려 커맨드 바인딩을 많이 사용합니다. 그래서 나는 폴링 바인딩을 시도했지만 아무것도 명령을 내리지 못했습니다.

<... Command="{Binding Path=SelectedModule.RenameModuleCmd}" /> 
<... Command="{Binding Path=AppRibbon.SelectedModule.RenameModuleCmd}" /> 

왜 이러한 기능이 작동하지 않는지 알 수 없습니다. 명령의 CanExecute 및 Execute 메서드와 RenameModuleCmd 속성의 getter에 중단 점을 설정했지만 충돌이 발생하지 않습니다. 아이디어?

답변

0

UserControl을 개발하고 그 안에 바인딩 할 때 바인딩 할 요소를 지정해야합니다. 보십시오 : 귀하의 게시물을 의미하는 것으로 보인다

<... Command="{Binding ElementName=AppRibbon, Path=SelectedModule.RenameModuleCmd}" /> 

이 당신의 UserControl이 AppRibbon이라는 가정하면.

+0

감사합니다. JustABill,하지만 SelectedModule이 정의 된 UserControl 내에서이 작업을 수행하고 있습니다. 따라서 ElementName이 관련이 있다고 생각하지 않았습니다. 나는 이것을 테스트 할 수있는 앱을 가지고 있지 않지만 변화를주지 않을 것이라고 생각한다. –

+0

UserControl (또는 Window 또는 다른 '가장 바깥 쪽'요소 인 요소)에 바인딩 할 수는 없지만 ElementName을 전달하거나 DataContext가 이미 설정되어 있지 않으면 직관적 인 것처럼 보입니다. 후자를했다면 잘못 읽었고 사과드립니다. – JustABill

+0

방금 ​​이름 ()을 확인한 다음 바인딩으로 추가했습니다. Command = "{Binding ElementName = Ribbon, Path = SelectedModule.RenameModuleCmd}" The Ribbon UserControl has public 이름이 RenameModuleCmd 인 ICommand 형식의 Public 속성을 포함하는 ModuleViewModel 형식의 SelectedModule 속성입니다. 나는 getter에서 중단 점을 설정하고 불행하게도 아무 일도 일어나지 않습니다. 그러나 같은 버튼에서 다음을 수행하는 클릭 핸들러를 추가하면 원하는 동작을 얻게됩니다 (이벤트를 피하기를 선호합니다) : SelectedModule.RenameModuleCmd.Execute (null); 아이디어? –