2011-05-02 7 views
0

데이터 바인딩 된 메뉴의 각 항목에 명령을 추가하려면 어떻게합니까? 기본적으로, 나는 이런 식으로 뭔가가 : 메뉴의 각 항목에 대해WPF : 데이터 바인딩 된 동적 메뉴의 각 MenuItem에 명령 추가

 <MenuItem Header="View" ItemsSource="{Binding ...}" /> 

을, 나는 그것을 자사의 DataContext에 따라 명령을 줄 필요가있다. 템플릿은 생성 된 MenuItem 컨테이너 안에 있기 때문에 ItemTemplate을 사용할 수 없습니다. 아, 명령에 입력 제스처가 있어야하므로 메뉴를 열기 전에 생성해야합니다.

더 좋은 방법이 있나요? 어쩌면 코드 숨김으로 항목을 추가/제거해야합니까?

+0

더 나은 예를 보여줄 수 있습니까? –

+1

CommandParameter 속성을 사용하고 각 메뉴 항목을 동일한 명령에 바인딩 할 수 있습니까? 따라서 다른 매개 변수에 따라 실행 된 이벤트를 구현할 수 있습니다. – Howard

+0

@Howard - 그건 내가 받아 들인 대답보다 깨끗하지만, 명령 매개 변수를 설정하는 방법? –

답변

1

MenuItem (및 Menu)은 ItemsControls라는 것을 기억하십시오. 즉, 컬렉션을 바인딩 할 수 있습니다. 즉, ICommand가있는 컬렉션 (일명, 뷰 모델)에 바인딩 할 수 있습니다.

하지만 우리는 그걸 원하지 않습니다. 우리는 MenuItems를 원합니다. 그래서 당신이 할 수있는 것은 뒤에서 만드는 MenuItems 컬렉션에 바인딩하는 컬렉션을 만드는 것입니다.

그러나 우리가 도움을 줄 수 있다면 컨트롤을 코드 숨김에 설치하고 싶지는 않습니다. 그것은 불량한 테스트 가능성으로 이어지고 유전 적으로 clunky합니다.

그래서 우리가 대신 할 수있는 사업입니다 개체의 컬렉션에 바인딩되어 있지만 제대로 각에 바인딩 된 메뉴 아이템의 목록에 그 목록을 변환하는 custom TypeConverter을 사용하여 어떤 객체

이 방법은 정말 좋은 대해 무슨 메뉴 구조가 얼마나 깊은 지 상관없이 작동합니다. Typeconverter는 뷰 모델을 따라갈 수 있고 동일한 유형 변환기를 사용하는 새로운 바인딩을 반복적으로 추가 할 수 있습니다.

또 다른 옵션은 MenuItem을 포함하는 뷰포트 모델에 대한 DataTemplate을 만드는 것입니다. 그 접근법을 사용하여 몸짓을 처리하십시오. 그것은 가능할 수도 있고 그 접근법 또한 재귀 적이다.

+0

음 ... 고마워! ValueConverters를 많이 사용하여 형식 변환기를 완전히 잊어 버렸습니다 ... 예, MenuItem 접근 방식으로 DataTemplate을 시도했지만 메뉴 항목 내부의 메뉴 항목이므로 이상하게 보입니다. –

+0

그래, 그게 문제가 될 수있는 어딘가에서 읽을 기억 ... 당신은 이미 이것에 대해 알고 있지만 참조로, 여기에 코드에서 만들기 바인딩을위한 HowTo 페이지가 있습니다 : http://msdn.microsoft.com/en-us/ library/ms742863.aspx – aL3891