0

Не могу понять, почему я не могу вызвать eventToCommand в моей таблице данных внутри ItemControl. В соответствии с этим post я должен реализовать его в dataTemplate, но команда никогда не вызывается. Это eventToCommand im пытается вставить мой код.EventToCommand в ItemControl в Windows Phone 8

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

И это код, который я пытаюсь выполнить. Однако, как говорится в комментариях, он никогда не вызывается, когда помещается в dataTemplete. Проблема не в viewModel, команда работает в панели TEMplate.

<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> 

Как узнать, какой предмет был нажат?

ответ

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> 
0

Я думаю, что это связано с вашей привязкой в ​​шаблоне данных. Как создается представление? Я думаю, что команда является свойством viewModel, а не GroupRow1, которая является коллекцией элементов управления вашего элемента. Вам нужно привязать команду к вашей модели ViewModel. SO, если ваше представление является usercontrol, должно работать следующее. (Если его другого типа, то изменить ancestortype)

<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}"/> 

Параметр команда добавляет имя TextBlock, например, вы могли бы изменить что-либо свойство TextBlock.

Я бы лично SelectedItem недвижимости в моем ViewModel, которые могут быть доступы в качестве объекта из ItemSelectCommand

Надеется, что это помогает.

+0

Спасибо, теперь я вижу проблему. Однако это решение не работает в silverlight, но только в WPF. Silverlight не поддерживает FindAncestor. – Zeezer

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> 
+0

Спасибо за ответ, но это не работает в silverlight и WP, только в WPF. Silverlight не поддерживает FindAncestor – Zeezer

+0

Мое решение не реализует find ancestor. Посмотрите внимательно, прежде чем комментировать – Xelom

+0

Извините. Но я имел в виду Предка в целом. Windows Phone не работает с предком, и в этом случае AncestorType. – Zeezer

1

У меня была аналогичная проблема, прежде, чем решить это для меня было ссылки на виртуальную машину в связывании. Попытка установить PassEventArgsToCommand ложь, если вы хотите получить деталь вместо EventArgs

<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> 

Edit- Если вы используете MVVM Light, в app.xml вы должны иметь что-то вроде:

xmlns:vm="clr-namespace:PhoneApplication.ViewModel (пространство имен, ваш ViewModelLocator находится под)

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

Вы рассказываете связывание смотреть в ViewModelLocator для конкретной виртуальной машины.

Надеюсь, это поможет, С уважением.

+0

Вы разрабатываете для WP8? Что я должен поставить в StaticResource? Visual studio говорит: ресурс «Локатор» не может быть разрешен. – Zeezer

+0

@ Zeezer yep, проверьте редактирование. –

+0

Спасибо, я думаю, вы имели в виду app.xaml в разделе Application.Resources, но что такое пространство имен vm? Я получаю следующую ошибку: префикс пространства имен «VM» не определен – Zeezer