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 を参照することでした。PassEventArgsToCommandEventArgs の代わりにアイテムを受け取りたい場合は、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" />

特定の VM の ViewModelLocator を調べるようバインディングに指示しています。

よろしくお願いします。

于 2013-04-16T10:09:03.517 に答える
0

データテンプレートでのバインディングに関係していると思います。ビューはどのように作成されますか? コマンドは、アイテム コントロールのコレクションである GroupRow1 ではなく、viewModel のプロパティだと思います。ViewModel でコマンドにバインドする必要があります。SO ビューがユーザーコントロールの場合、次のように動作するはずです。(別のタイプの場合は、祖先タイプを変更します)

 <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 に答える