我在这个项目中使用MVVM,我有一个绑定到Customers集合的列表框。我想创建一个事件来使用elementselected的id导航detailsPage:
<ListBox ItemsSource="{Binding Customers}" x:Name="state_list" SelectionChanged="state_list_SelectionChanged">
<i:Interaction.Triggers>
<i:EventTrigger EventName="selectionchanged">
<cmd:EventToCommand Command="{Binding stateSelectedCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding nom}" />
<!--TextBlock Text="{Binding LastName}" />
<TextBlock Text="{Binding Text, ElementName=tbCount}" /-->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我无法弄清楚如何将所选项目添加到uri然后用它来获取数据。示例或教程会很有帮助。谢谢:))
答案 0 :(得分:6)
我将在ViewModel中创建一个“SelectedCustomer”属性(在Customers属性旁边)并将其绑定到SelectedItem。然后,在该属性的setter上,您可以导航到所需的页面。这样你就可以消除混乱的事件和命令。
<ListBox x:Name="state_list
ItemsSource="{Binding Customers}"
SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}">
...
public Customer SelectedCustomer
{
get
{
return _selectedCustomer;
}
set
{
if (value != null)
{
_selectedCustomer = value;
//Navigate to your page here, either with Navigator class or any other mechanism you have in place for changing content on screen
}
}
}
答案 1 :(得分:1)
AlexDrenea为您提供了一种将SelectedItem绑定到viewmodel上的属性的好方法。如果您想在MVVM架构中基于此进行导航,我建议使用消息传递来完成它。
我在博客文章中介绍过这一点,但是在MVVMLight中执行此操作的简短摘要是创建一个位于应用程序级别的Navigator类。
public class Navigator
{
private PhoneApplicatoinFrame RootFrame;
public Navigator(PhoneApplicationFrame frame)
{
RootFrame = frame;
RegisterMessages();
}
private void RegisterMessages()
{
Messenger.Default.Register<ShowTrackerMessage>(this, ShowTracker);
}
private void ShowTracker(ShowTrackerMessage msg)
{
RootFrame.Navigate(new Uri("/Views/ItemLocationCompassView.xaml", UriKind.RelativeOrAbsolute));
}
}
然后,作为应用程序启动的一部分,创建它并向其传递对RootFrame的引用:
private static Navigator _navigator;
public static Navigator Nav
{
get { return _navigator; }
}
...
_navigator = new Navigator(this.RootFrame);
然后,您可以选择如何发送导航消息。
选项1:在ViewModel中,挂钩到PropertyChanged事件(INotifyPropertyChanged的一部分),并在SelectedItem属性更改时发送相应的消息。
选项2:绑定到ListBox的SelectionChanged事件。我使用MVVMLight的EventToCommand将该事件发送到我的ViewModel中的RelayCommand,然后做出适当的反应以将消息发送到Navigator对象。
详细介绍了这一点