使用MVVM从列表框中获取选择项

时间:2012-02-23 17:49:22

标签: windows-phone-7 mvvm-light

我在这个项目中使用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然后用它来获取数据。示例或教程会很有帮助。谢谢:))

2 个答案:

答案 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对象。

我在http://www.smartchitecture.com/?p=27

详细介绍了这一点