0

我不明白为什么我不能在 ItemControl 内的数据模板中调用 eventToCommand。根据这篇文章,我应该在 dataTemplate 中实现它,但永远不会调用该命令。这是我试图在我的代码中插入的 eventToCommand。

<i:Interaction.Triggers>
   <i:EventTrigger EventName="Tap">
        <cmd:EventToCommand Command="{Binding ItemSelectedCommand, Mode=OneWay}"
               PassEventArgsToCommand="True" />
   </i:EventTrigger>
</i:Interaction.Triggers>

这是我试图将其插入的代码。但是,正如评论所说,它在放入 dataTemplete 时永远不会被调用。问题不在于 viewModel,该命令在 panelTemplate 中有效。

<ItemsControl ItemsSource="{Binding GroupRow1}" >
   <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
             <!-- COMMAND WORKS HERE, but cannot locate which item has been pressed -->
         </StackPanel>
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
       <DataTemplate>
           <Border Background="#FF1756C3" Height="173" Width="173" Margin="12,0,0,0" >
                <!-- COMMAND DOES NOT WORK HERE?!?! -->
                <StackPanel> 
                   <TextBlock Text="{Binding LineOne}" /> <!-- These bindings work -->
                   <TextBlock Text="{Binding LineTwo}" />
                </StackPanel>
           </Border>
       </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

我如何知道哪个项目被按下了?

4

4 回答 4

2

很多答案,但没有一个对我有用。我重新设计了我的解决方案并摆脱了正在工作的 eventtocommand。相反,我制作了带有自定义内容的按钮,使其看起来与我的边框相同。

更简单的代码和更好的解决方案。

<ItemsControl ItemsSource="{Binding GroupRow1}" >
<ItemsControl.ItemsPanel>
  <ItemsPanelTemplate>
     <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
     </StackPanel>
  </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
   <DataTemplate>
      <Button CommandParameter="{Binding LineOne}" Height="195" Width="195" Margin="0,0,-10,0" Click="Button_Click_2" Background="#FF1756C3">
            <StackPanel> 
               <TextBlock Text="{Binding LineOne}" /> 
               <TextBlock Text="{Binding LineTwo}" />
            </StackPanel>
       </Button>
   </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
于 2013-04-24T08:59:37.163 回答
1

我之前遇到过类似的问题,为我解决的问题是在绑定中引用 VM。PassEventArgsToCommand如果要接收项目而不是 EventArgs,请尝试设置为 false

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Tap">                                    
         <cmd:EventToCommand PassEventArgsToCommand="False" 
                             CommandParameter="{Binding}" 
                             Command="{Binding Path=VM_Name_Here.Command_Name_Here, Source={StaticResource Locator}}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

编辑 - 如果您使用的是 MVVM Light,app.xml您应该有类似的内容:

xmlns:vm="clr-namespace:PhoneApplication.ViewModel(您的 ViewModelLocator 所在的命名空间)

   <vm:ViewModelLocator x:Key="Locator"
                             d:IsDataSource="true" />

您告诉绑定在 ViewModelLocator 中查找特定 VM。

希望它有所帮助,问候。

于 2013-04-16T10:09:03.517 回答
0

我认为这与您在数据模板中的绑定有关。视图是如何创建的?我认为该命令是 viewModel 的属性,而不是 GroupRow1,它是您的项目控件的集合。您需要绑定到 ViewModel 中的命令。因此,如果您的视图是用户控件,则以下内容应该有效。(如果它是另一种类型,则更改祖先类型)

 <cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.ItemSelectedCommand}"
    CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBlock}},Path=Name}"/>

例如,命令参数添加文本块的名称,您可以将其更改为文本块的任何属性。

我个人会在我的视图模型中拥有 SelectedItem 属性,该属性可以作为 ItemSelectCommand 中的对象进行访问

希望这可以帮助。

于 2013-04-10T16:20:08.097 回答
0

答案很明显。在 ItemsPanelTemplate 中,您的绑定源仍然是 ViewModel,并且您的命令停留在您的 ViewModel 上。但是在 DataTemplate 中,您正在迭代 GroupRow1 项目,并且您的绑定源是单个项目。如果你想在那里使用你的命令,你必须从示例中的相对源绑定:

<i:Interaction.Triggers>
 <i:EventTrigger EventName="Tap">
    <cmd:EventToCommand Command="{Binding ViewModel.ItemSelectedCommand, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}"
           PassEventArgsToCommand="True" />
 </i:EventTrigger>
</i:Interaction.Triggers>
于 2013-04-12T06:21:26.793 回答