2010-06-03 1 views
1

명령 기능을 사용하는 메뉴 인 WPF 앱이 있습니다. 모든 것이 잘 정리되어 있으며 메뉴의 버튼을 클릭하면 명령이 실행됩니다. 그러나 명령의 CanExecute 부분을 존중하기 위해 버튼의 IsEnabled 상태를 가져 오는 데 문제가 있습니다.WPF의 명령 내에서 컨트롤에 액세스

하나의 과제는 UI에서 수행중인 작업을 명령에서 확인해야한다는 것입니다. 예를 들어, 하나의 명령은 ListBox의 특정 항목을 선택해야 ListBox에 대한 참조를 가져올 수 있지만 명령이 내 뷰 모델 (MVVM 패턴)에 노출되어 있기 때문에 사용할 수 없습니다. UI에 대한 액세스 (BTW, ListBox가 다른 사용자 컨트롤 [parent = mainwindow]에있는 동안 메뉴는 한 사용자 컨트롤 [parent = mainwindow]에 있음).

또한 명령의 CanExecute 메서드를 false로 반환하여 코드를 false로 설정하더라도 단추의 Enabled 속성은 변경되지 않습니다 ... 명령은 실행되지 않지만 변경되지는 않습니다 ... 절망적입니다. . 나는 CanExecuteChanged 이벤트를 수정/발생시킬 필요가 있다고 가정하지만, 언제해야하는지 잘 모르겠습니다 (좋은 샘플을 찾을 수 없습니다).

의견? 이것은 다음 다른 컨트롤에 바인딩 할 수 있습니다 - 당신은 여전히 ​​작동 할 수있는 CommandParameter를 의미 -

답변

2

MVVMLight에서 메신저 클래스를 사용해보십시오. ViewModel 간 통신에 도움이됩니다.

그리고이 시도 제공 :

이 목록 상자의 뷰 모델에서의 selectedItem 속성을 가지고 있습니다. 속성이 변경되는 동안 메시지를 브로드 캐스트합니다. 이 메세지를 메뉴의 ViewModel에 등록합니다. 논리에 대해 CanExecute 메서드의 SelectedItem 속성을 사용하십시오.

+0

체크 아웃 MVVMLight ... 나는 Messger 클래스 아이디어를 좋아합니다 ... 감사합니다! –

2

일반적으로, 당신은 무엇이든의 MenuItem/버튼의 명령 속성을 결합하는 것이다. 그러나 두 개의 뷰가 서로를 알지 못하면 두 뷰가 액세스 할 수있는 뷰 모델 (즉, 두 가지 속성에 바인딩 된 SelectedItem/SelectedItems 목록 상자가있는)을 필요로하고 CommandParameter 같은 속성에 단방향으로 바인딩). CanExecuteChanged 이벤트가 발생하는 경우에 대해서는

- 당신은 해고해야 CanExecute-방법에 포함 된 로직의 변경이있을 때마다 그. 항상 false 인 경우 Command 매개 변수가 설정되면 initalvalue를 읽으므로 절대로 이벤트를 발생 시켜서는 안됩니다. '

버튼이 이상하게 작동하는 경우 - IsEnabled 속성이 스타일의 영향을 받거나 직접 설정되었는지 확인하십시오.

희망이 도움이됩니다.