2013-11-16 3 views
1

Я делаю приложение Windows 8.1 с подсветкой MVVM для школы. Проблема, с которой я столкнулся, - это свойство Command. Я бы хотел, чтобы объект Movie был нажат, чтобы отправить его на другую страницу и отобразить дополнительную информацию об этом. Однако привязка не выполняется: привязка не выполняется в моем DataContext, а в моей модели Movie для команды. :(Команда не найдена

Сообщение об ошибке:

Error: BindingExpression path error: 'ShowInfoMovieCommand' property not found on 'Howest.NMCT.RottenTomatoes.Models.Movie, Howest.NMCT.RottenTomatoes.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. BindingExpression: Path='ShowInfoMovieCommand' DataItem='Howest.NMCT.RottenTomatoes.Models.Movie, Howest.NMCT.RottenTomatoes.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Microsoft.Xaml.Interactions.Core.InvokeCommandAction' (Name='null'); target property is 'Command' (type 'ICommand')

Мой XAML код на мой взгляд (Контекст данных устанавливается в верхней части страницы)

DataContext="{Binding GroupedItemsPageViewModel, Source={StaticResource Locator}}" 

В ItemTemplate для отображения фильмов

<DataTemplate x:Key="RottenTomatoesMovieItemTemplate"> 
    <Grid HorizontalAlignment="Left" Width="250" Height="230"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:EventTriggerBehavior EventName="Tapped"> 
       <Core:InvokeCommandAction **Command="{Binding ShowInfoMovieCommand}" CommandParameter="{Binding id}"/>** 
      </Core:EventTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 
     <Border> 
      <Image Source="{Binding posters.original}" Stretch="UniformToFill"/> 
     </Border> 
     <Grid VerticalAlignment="Bottom" Background="#B2CF4400" Height="50"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="18*"/> 
       <RowDefinition Height="21*"/> 
       <RowDefinition Height="11*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="24*"/> 
       <ColumnDefinition Width="101*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock x:Name="TitleTextblock" Text="{Binding title}" Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextStyle}" Margin="15,0,0,0" Grid.ColumnSpan="2"/> 
      <Image Source="{Binding ratings.critics_rating, Converter={StaticResource RatingToPhotoConverter}}" Width="15" HorizontalAlignment="Left" Margin="15,0,0,0" Grid.Row="1"/> 
      <TextBlock Text="{Binding ratings, Converter={StaticResource RatingToPercentFormat}}" Foreground="{StaticResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Grid.Column="1" Grid.Row="1" /> 
     </Grid> 
    </Grid> 
</DataTemplate> 

Мои ViewModel для страницы (GroupedItemsPageViewModel)

private void ShowInfoMovie(object clickedMovie) 
{ 
    Debug.WriteLine(clickedMovie); 
} 

private RelayCommand<object> _showInfoMovieCommand; 
public RelayCommand<object> ShowInfoMovieCommand 
{ 
    get 
    { 
     if (_showInfoMovieCommand == null) 
     { 
      _showInfoMovieCommand = new RelayCommand<object>(
       param => this.ShowInfoMovie(param) 
       ); 
     } 
     return _showInfoMovieCommand; 
    } 
} 

ответ

1

Никогда не ум нашел его сам. В моей DataTemplate моя команда привязки должна быть:

<Interactivity:Interaction.Behaviors> 
    <Core:EventTriggerBehavior EventName="Tapped"> 
     <Core:InvokeCommandAction Command="{Binding DataContext.ShowInfoMovieCommand, ElementName=pageRoot}" CommandParameter="{Binding}"/> 
    </Core:EventTriggerBehavior> 
</Interactivity:Interaction.Behaviors> 

В то время как в моем ViewModel это лучше, чтобы поймать свою собственную модель (фильм)

private void SetSelectedMovieDestinationView(Movie clickedMovie) 
{ 
//Do Stuff 
}