Прикрепленное поведение в приложениях Магазина Windows с помощью MVVM Light

Я пытался использовать Attached Behaviors в простом приложении Windows Store с использованием инфраструктуры MVVM Light. Поскольку мы не можем использовать System.Windows.Interactivity, как в Windows Phone, я использовал оба Windows.UI.Interactivity и либрарии WinRtBehaviors. Они работают хорошо, но проблема в том, что я не могу объявить прикрепленное поведение в шаблоне данных.

Я действительно хочу прикрепить команду к любому элементу в GridView, чтобы я мог передать идентификатор элемента в качестве параметра. Поскольку это присоединенное поведение не работает, единственное решение, которое я нашел, состоит в использовании события «SelectionChanged» GridView и передаче SelectedItem в качестве параметра свойству в ViewModel:

    <GridView Grid.Row="1"
              x:Name="itemGridView"
              AutomationProperties.AutomationId="ItemsGridView"
              AutomationProperties.Name="Items"
              TabIndex="1"
              Padding="116,136,116,46"
              ItemsSource="{Binding GeoTopArtists.topartists.artist}"
              SelectionMode="Single"
              SelectedItem="{Binding SelectedArtist, Mode=TwoWay}"
              IsSwipeEnabled="False"
              IsItemClickEnabled="False">

        <WinRtBehaviors:Interaction.Behaviors>
            <Win8nl_Behavior:EventToCommandBehavior Event="SelectionChanged" Command="SelectArtistCommand" CommandParameter="{Binding SelectedArtist.mbid}"/>
        </WinRtBehaviors:Interaction.Behaviors>

        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid HorizontalAlignment="Left" Width="250" Height="250">
                    <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
                        <Image Source="{Binding image[4].text}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
                    </Border>
                    <StackPanel VerticalAlignment="Bottom" Background="{StaticResource ListViewItemOverlayBackgroundThemeBrush}">
                        <TextBlock Text="{Binding name}" Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextStyle}" Height="60" Margin="15,0,15,0"/>
                        <TextBlock Text="{Binding url}" Foreground="{StaticResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

Было бы очень хорошо сделать что-то подобное (где нет необходимости иметь свойство SelectedArtist в ViewModel)

    <GridView Grid.Row="1"
              x:Name="itemGridView"
              AutomationProperties.AutomationId="ItemsGridView"
              AutomationProperties.Name="Items"
              TabIndex="1"
              Padding="116,136,116,46"
              ItemsSource="{Binding GeoTopArtists.topartists.artist}"
              SelectionMode="None"
              IsSwipeEnabled="False"
              IsItemClickEnabled="False">

        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid HorizontalAlignment="Left" Width="250" Height="250">
                    <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
                        <Image Source="{Binding image[4].text}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
                    </Border>
                    <StackPanel VerticalAlignment="Bottom" Background="{StaticResource ListViewItemOverlayBackgroundThemeBrush}">
                        <TextBlock Text="{Binding name}" Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextStyle}" Height="60" Margin="15,0,15,0"/>
                        <TextBlock Text="{Binding url}" Foreground="{StaticResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
                    </StackPanel>

        <WinRtBehaviors:Interaction.Behaviors>
            <Win8nl_Behavior:EventToCommandBehavior Event="Tapped" Command="SelectArtistCommand" CommandParameter="{Binding Artist.mbid}"/>
        </WinRtBehaviors:Interaction.Behaviors>

                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

person jvinyes    schedule 10.04.2013    source источник


Ответы (1)


Эта ссылка может вам помочь. Свойство зависимости определяется и подключается к команде в модели представления. Таким образом, всякий раз, когда есть взаимодействие, выбранный элемент может быть отправлен в качестве управляющего параметра, что ясно продемонстрировано в этом видео.

person user1618746    schedule 25.04.2013