我正在为Windows Phone构建一个应用程序,在这个应用程序中,我有一个带有标题,绘图和图片的电影列表。 我将此列表绑定到ListBox,其中包含用于显示数据的项目的自定义DataTemplate。我还创建了第二页来显示每部电影的细节。 我现在的问题是这些页面之间的导航。我正在使用MVVM构建应用程序,我发现在Internet上搜索的大多数方法都是在代码隐藏中使用OnSelectionChanged事件,但它又是我想要的,也就是使用MVVM。
我见过的其他方法,就是我正在尝试的方法,是将SelectedItem绑定到ViewModel中的属性,但我不能让它更改属性,似乎我无法选择一个项目在列表框中。此外,当我按下列表框中的某个项目时,我没有视觉反馈,例如我们在手机设置菜单中的反馈。
我在列表框中使用的代码是:
<ListBox Margin="0,0,-12,0" ItemsSource="{Binding Movies}" SelectedItem="{Binding SelectedMovieItem}" SelectionMode="Single" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,17">
<!--Replace rectangle with image-->
<Rectangle Height="50" Width="50" Fill="#FFE5001b" Margin="12,0,9,0"/>
<StackPanel Width="311">
<TextBlock Text="{Binding Name}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}" Foreground="#000" />
<!--<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>-->
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我看到的另一种方法是使用INavigationService来实现这一点,我发现这篇文章:http://windowsphonegeek.com/articles/MVVM-in-real-life-Windows-Phone-applications-Part1 我阅读了第一部分和第二部分,但我无法理解这一部分是有效的。
所以,我想知道的是我使用的方法是否正确进行页面导航,或者是否有更好的方法使用MVVM在列表框上进行视觉反馈。
答案 0 :(得分:1)
为什么在针对MVVM的代码中处理事件?处理事件交互是UI的一部分。当然,你不会在那里编写逻辑代码。但你只是想进入下一页。我做这样的事情:
private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// If selected index is -1 (no selection) do nothing
if (MainListBox.SelectedIndex == -1)
return;
// Navigate to the new page
NavigationService.Navigate(new Uri("/Views/detailsPage.xaml?selectedItem=" + MainListBox.SelectedIndex, UriKind.Relative));
// Reset selected index to -1 (no selection)
MainListBox.SelectedIndex = -1;
}