2014-01-09 41 views
0

在下面的XAML輕敲StackPanel將同時觸發MyCommand1MyCommand2冒泡到父ListView項:防止孩子點擊事件使用MVVM相互作用

<phone:LongListSelector ItemsSource="{Binding SomeSource}"> 
    <phone:LongListSelector.ItemTemplate> 
     <DataTemplate > 
      <Grid> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Tap"> 
         <i:InvokeCommandAction Command="{Binding MyCommand1}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 

       <StackPanel > 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Tap"> 
          <i:InvokeCommandAction Command="{Binding MyCommand2}" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </StackPanel> 
      </Grid> 
     </DataTemplate> 
    </phone:LongListSelector.ItemTemplate> 
</phone:LongListSelector>   

這怎麼可能,以確保只有MyCommand2被觸發,同時保持適當的MVVM風格?

+0

嘗試通過設置一些背景色到stackpanel。但我不確定 – asitis

+0

如何命令的嬰兒車。你能處理來自命令嬰兒車的事件參數嗎?所以它不會觸發'Grid' – Sankarann

+0

你有一個Grid並且裏面有一個空的StackPanel。您正試圖捕捉Tap事件,但您甚至沒有顯示任何內容。點擊事件如何被觸發?當您沒有StackPanel或Grid內的元素時,標籤事件的原始來源是什麼元素?我建議你改變你的設計。更進一步解釋我們更多的是自來幹什麼,它來自哪裏? –

回答

2

解決方法是編寫自己的EventTrigger並從「System.Windows.Interactivity.EventTrigger」繼承。這會產生以下類,然後您可以在XAML中使用該類來進行命令綁定。

public class EventTriggerWithoutPropagation : System.Windows.Interactivity.EventTrigger 
{ 
    protected override void OnEvent(System.EventArgs eventArgs) 
    { 
     var routedEventArgs = eventArgs as RoutedEventArgs; 
     if (routedEventArgs != null) 
      routedEventArgs.Handled = true; 

     base.OnEvent(eventArgs); 
    } 
} 

如果你正在開發的Windows Phone投地GestureEventArgs,而不是RoutedEventArgs因爲後者不具有Handled財產。