2016-07-05 2 views
0

안녕하세요 Stackoverflowers,목록 상자 선택이 다른 마우스 이벤트를 숨김

나는 System.Windows.Control.ListBox가 있습니다. 그것은 훌륭한 일을하고 있지만 특정 유형의 아이템을 선택할 때 몇 가지 행동을 취하고 싶습니다.

ListBox의 View Model (Foo)이 내가 원하는 작업 (필요한 경우 다른 ViewModel : Bar에서 오는 일부 데이터)을 모르기 때문에 SelectedItem의 bind 속성에서이 작업을 수행 할 수 없습니다.

내 두 ZOT가

내가 앞을 향해 열린 길을 건너 Interaction.Triggers를 사용 ZOT하는 푸과 바에서 이벤트를 클릭 푸과 바

모두의 콘텐츠에 액세스하는 뷰 모델을 위해, 더 큰 클래스 ZOT의 필드입니다 언급, EventTrigger 및 InvokeCommandAction. Bar (캔버스)에 잘 작동합니다. 그러나 나는 Listbox에 문제가있다.

SelectionChanged, MouseDown 및 Click 이벤트를 테스트 한 후 ListBox를 감싸는 격자를 클릭하면 MouseDown이 트리거되지만 ListBox를 클릭하면 트리거되지 않은 것처럼 보입니다. 목록 상자의 포함 된 선택 항목이 다른 이벤트와 충돌하는 것 같습니다.

다른 사람이 선택한 항목에 따라 다른보기 모델에서 특정 작업을 수행 할 생각이 있습니까?

덕분에 많은

편집 : 여기

주에서 (ToolboxView.xaml에서) 목록 상자에 대한 XAML 여기

 d:DataContext="{d:DesignInstance viewModels:ToolboxViewModel}"> 
     <Grid> 
      <ListBox 
       ItemsSource="{Binding Tools}" 
       SelectedItem="{Binding SelectedTool}" 
       x:Name="ToolView" > 

      <ListBox.ItemTemplate> 
       <DataTemplate DataType="interfaces:IBuilder"> 
        <TextBlock 
         FontWeight="DemiBold" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Text="{Binding Name}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

이 목록 상자에서 이벤트이며, window xaml (어떤 모델이리스트 박스 뷰 모델을 가지고 있는지, 나는 왜 아래에 설명하는지). 그러나 이벤트는 트리거되지 않습니다. 같은 파일에서 3 개의 유사한 이벤트가 완벽하게 작동합니다 (캔버스에서). SelectionChanged 대신 MouseDown을 사용하려고했는데 목록 상자가 포함 된 표를 클릭 할 때 트리거되지만 목록 상자를 클릭하면 트리거되지 않습니다.
<DockPanel> 
     <views:ToolboxView DockPanel.Dock="Left" 
           Width="120" 
           IsHitTestVisible="True" 
           DataContext="{Binding ToolBoxViewModel}" 
           x:Name="ToolboxView"> 

      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectionChanged"> 
        <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
              CommandParameter="{Binding ElementName=ToolboxOverlayView}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 

내가 "임베디드 선택"이라는 이제 어떻게 (MainWindow.xaml에서)

내가 목록 상자 내부의 요소를 강조하고 선택할 수있는 목록 상자의 동작입니다. 이것은 위의 코드와 완벽하게 작동합니다 (필자의 도구를 선택할 수 있으며 그에 따라 ViewModel에 바인딩 된 속성이 변경됩니다). 내가 뭘 하려는지 ListBox 안에 요소의 특정 범주가 선택되면 특별한 일을 할 SelectionChanged 이벤트를 발생시키는 것입니다.

내가 목록 상자의 ItemSelected에 바인더 제본 재산의 세터에 불과하다 목록 상자 뷰 모델에서 알 수없는 datas를 필요로 할 수있는 작업에서이 작업을 수행 할 수

내가 목록 상자의 뷰 모델을 보유하고 MainWindow를보기 모델을 가지고 왜 나는 주 창보기 모델 (및 다른보기 모델)에서 SelectionChanged 이벤트를 가져 오려고합니다.

명확하지 않은 경우 알려주세요.

+1

xaml이 (가) 있습니다. 이것은 null 일 수 있습니다. 예를 들면 배경 코드는 우리가 코드를 표시하지 않았기 때문에 잘 모르겠습니다. – nkoniishvt

+0

실제로 무엇을 하려는지 구체적으로 말하고 코드를 보여주십시오. 또한 내가하고 싶은 마지막 일은 자신의 감정을 무효화하는 것입니다. 그러나 "임베디드 선택"이 무엇인지, 왜 그것이 당신에게 그 특별한 감정을주는 지 모르겠습니다. –

+0

@nkoniishvt 더 많은 정보를 얻기 위해 편집했습니다. – Csi

답변

1

SelectionChanged 이벤트를 알지 못하는 ToolboxView에서 SelectionChanged 이벤트를 설정하려고합니다.

만들 수있는 두 개의 명령 및 매개 변수 저장 ToolboxView에서 DP 다음 ToolboxView.xaml에서 다음

#region SelectionChangedCommand 

public ICommand SelectionChangedCommand 
{ 
    get { return (ICommand)GetValue(SelectionChangedCommandProperty); } 
    set { SetValue(SelectionChangedCommandProperty, value); } 
} 

private readonly static FrameworkPropertyMetadata SelectionChangedCommandMetadata = new FrameworkPropertyMetadata { 
    DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
}; 

public static readonly DependencyProperty SelectionChangedCommandProperty = 
    DependencyProperty.Register("SelectionChangedCommand", typeof(ICommand), typeof(ToolboxView), SelectionChangedCommandMetadata); 
#endregion 


#region SelectionChangedCommandParameter 

public Object SelectionChangedCommandParameter 
{ 
    get { return (Object)GetValue(SelectionChangedCommandParameterProperty); } 
    set { SetValue(SelectionChangedCommandParameterProperty, value); } 
} 

private readonly static FrameworkPropertyMetadata SelectionChangedCommandParameterMetadata = new FrameworkPropertyMetadata { 
    DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
}; 

public static readonly DependencyProperty SelectionChangedCommandParameterProperty = 
    DependencyProperty.Register("SelectionChangedCommandParameter", typeof(Object), typeof(ToolboxView), SelectionChangedCommandParameterMetadata); 
#endregion 

:

<Grid> 
    <ListBox 
     ItemsSource="{Binding Tools}" 
     SelectedItem="{Binding SelectedTool}" 
     x:Name="ToolView" > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand, RelativeSource={RelativeSource AncestorType={x:Type ToolboxView}}}" 
             CommandParameter="{Binding Path=SelectionChangedCommandParameter, RelativeSource={RelativeSource AncestorType={x:Type ToolboxView}}}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <ListBox.ItemTemplate> 
      <DataTemplate DataType="interfaces:IBuilder"> 
       <TextBlock 
        FontWeight="DemiBold" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        Text="{Binding Name}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

을 그리고 MainWindow.xaml에서 사용 :

<views:ToolboxView DockPanel.Dock="Left" 
        Width="120" 
        IsHitTestVisible="True" 
        DataContext="{Binding ToolBoxViewModel}" 
        x:Name="ToolboxView" 
        SelectionChangedCommand="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
        SelectionChangedCommandParameter="{Binding ElementName=ToolboxOverlayView}"/>