2012-08-01 3 views
0

목록으로 채우는 항목 컨트롤이 있고 목록에 '시간'과 '설명'이라는 두 매개 변수가 있습니다. 그것을 위해, 나는 시간을 위해 HyperLinkButton을 사용하고 설명을 위해 Label을 사용하고 있습니다.ItemControl 내에서 이벤트 트리거가 작동하지 않습니다.

내가 원하는 것은 메인 viewModel에서 하이퍼 링크 버튼의 EventTrigger를 사용하여 클릭 이벤트를 만들고 싶습니다. , 내가 프로젝트를 빌드 할 때

<ItemsControl 
    x:Name="transcriptionTextControl" 
    ItemsSource="{Binding MyCollectionOfTranscription, Mode=TwoWay}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <HyperlinkButton Content="{Binding Time}"> 
        <ToolTipService.ToolTip> 
         <ToolTip Content="Time"/> 
        </ToolTipService.ToolTip> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <i:InvokeCommandAction 
           Command="{Binding HyperLinkButtonCommand}" 
           CommandParameter="{Binding 
            ElementName=transcriptionTextControl }" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </HyperlinkButton> 
       <sdk:Label Content="{Binding Description}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

,이 하이퍼 링크에 오류가 있지만 ICommand의를 제공하지 않습니다이 이벤트 트리거이 외부에서 잘 작동하는 동안, '기호 HyperLinkButtonCommand를 확인할 수 없음'으로 경고를 보여줍니다 내 코드입니다.

점점 아니, 그 뒤에 실제 문제가 무엇인지, PLZ의 인스턴스에 HyperLinkButtonCommand라는 속성을 찾습니다하려고하는 바인딩

<i:InvokeCommandAction 
    Command="{Binding HyperLinkButtonCommand}" 
    CommandParameter="{Binding 
     ElementName=transcriptionTextControl }" /> 

를 여러분의 소중한 제안 ...

+2

왜 트리거를 사용하고 있습니까? HyperlinkButton에는 Command 속성이 이미 있습니다. –

답변

1

먼저 발산 MyCollectionOfTranscription에 포함 된 유형 (이 양방향에 바인딩 할 필요 없음).

이 컬렉션의 각 요소를 통해 ItemsControl 반복

ItemsControl.ItemTemplate에 정의 된 템플릿의 복사본을 생성 (측면 노트, 당신의 명령에 ItemsControl에 보내기. MVVM 하지이다), 그리고 BindingContext 동일하게 설정합니다 이 요소 (필자는 대본을 사용합니다). 바인딩에서 얻은 경고에서 데이터 바인딩 디버그 설정을 크롤링하는 경우 HyperLinkButtonCommand을 찾지 못했음을 알 수 있습니다. (UserControl이 될 수 있지만, 여기에 가정입니다) 가정

  1. HyperLinkButtonCommand

    enter image description here

    는 뷰 모델에 정의 된 명령이며,

  2. 이 XAML의 루트는 창이다
  3. ViewModel은 Window의 DataContext입니다.

당신은 다음과 같은 바인딩을 변경할 수 있으며 작동합니다 (또는 그것에서 실마리를 얻어야한다) 내 루트 "루트"의 x:Name를주고 내가 좋아

<i:InvokeCommandAction 
    Command="{Binding HyperLinkButtonCommand, 
       RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
    CommandParameter="{Binding 
     ElementName=transcriptionTextControl }" /> 

을하고 "ElementName을 = 루트를 사용 "이런 경우에.

+0

이제 내 코드가 경고를 표시하지 않지만 hyperLinkButtonCommand가 트리거되지 않습니다. –

+0

자세히 설명하겠습니다. ViewModel에서 HyperLinkButtonCommand 속성에 대한 코드를 으로 설정했습니다. HyperLinkButtonCommand = 새 DelegateCommand (HyperLinkButtonAction, CanHyperLinkButton); 공용 ICommand HyperLinkButtonCommand {get; 세트; } public void HyperLinkButtonAction (object param) { MessageBox.쇼 ("HII"); } 개인 bool CanHyperLinkButton (개체 매개 변수) { return true; } 보기에서 시간과 설명 필드가 반복 될 것이므로 '시간'하이퍼 링크 버튼을 클릭 할 때마다 messageBox를 표시하려고하지만 발사는하지 않습니다. –

+0

@ user1298386 : 질문을 편집하고 명령을 인스턴스화 할 메서드를 추가하십시오. – Will

관련 문제