0

我正在构建基于位置的服务 Windows Phone 应用程序,这是我的第一个应用程序。我在使用 MVVM Light 时页面导航有困难。我正在关注Jesse Liberty 教程,到目前为止,当我在 FirstPage 中单击 ListBox 上的项目时,它可以导航到 SecondPage。

我想要做的是,用户在与我ListBoxFirstPage绑定中选择ListPickerSecondPage. 因此用户可以轻松更改他们想要搜索的内容SecondPage

在此处输入图像描述

主页.xaml

<ListBox x:Name="MainMenu" ItemTemplate="{StaticResource MainMenu}" ItemsSource="{Binding Categories}" Margin="0,97,0,0">
    <Custom:Interaction.Triggers>
        <Custom:EventTrigger EventName="SelectionChanged">
            <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding MainMenuCommand, Mode=OneWay}"/>
        </Custom:EventTrigger>
    </Custom:Interaction.Triggers>
</ListBox>

MainPage.xaml.cs

public MainPage()
{
    InitializeComponent();

    Messenger.Default.Register<CategoryModel>(this,c => NavigationService.Navigate(new Uri("/Views/VenueList.xaml", UriKind.Relative)));
}

主视图模型.cs

public MainViewModel()
{
     MainMenuCommand = new RelayCommand<CategoryModel>((msg) => GoToVenueList(msg));
}

public RelayCommand<CategoryModel> MainMenuCommand
{
    get;
    private set;
}

private void GoToVenueList(CategoryModel msg)
{
    Messenger.Default.Send(msg);
}

private CategoryModel _selectedItem;
public CategoryModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (_selectedItem == value)
        {
            return;
        }

        var oldValue = _selectedItem;
        _selectedItem = value;

        RaisePropertyChanged("SelectedItem", oldValue, value, true);
    }
}

地点列表.xaml

<toolkit:ListPicker Margin="0,153,0,0" Background="{StaticResource PhoneAccentBrush}" VerticalAlignment="Top"
                            SelectedItem="{Binding Item, Mode=TwoWay}"
                            ItemsSource="{Binding Categories}"
                            ItemTemplate="{StaticResource CategorySelector}" FullModeHeader="Category" FullModeItemTemplate="{StaticResource FullCategorySelector}" BorderBrush="{StaticResource PhoneAccentBrush}" />

希望任何人都可以帮助我的问题。

场地列表视图模型

public VenueListViewModel()
{
    Messenger.Default.Register<PropertyChangedMessage<CategoryModel>>(
        this,
        (action) => Item = action.NewValue
    );
}

private CategoryModel _item;
public CategoryModel Item
{
    get
    {
        return _item;
    }
    set
    {
        if (_item == value)
        {
            return;
        }

        _item = value;

        // Update bindings, no broadcast
        RaisePropertyChanged("Item");
    }
}
4

2 回答 2

1

这是您需要两个 ViewModel 相互通信的典型案例。

在这种情况下,最好的方法是使用框架mvvm-light的功能,特别是因为您正在使用。Messaging

如果您需要一些帮助,您会在网络上找到大量示例和文档(在 channel9 上查找 Laurent Bugnion 的网络广播,例如这个),实际上只需为某种类型的消息,然后从其他地方发送。

这样,您的第一个视图模型会向您的第二个视图模型发送一条消息,说明已选择了哪个列表项。您的目标视图模型会自行更新以反映这一点。然后您的初始视图模型命令导航到目标页面,并且由于它使用目标视图模型,它运行良好。

于 2013-02-25T20:44:05.493 回答
0

有几种可能,我主要使用列表框的 SelectedItem 解决方案......但纯消息传递也是可能的。

看看一个类似的问题,这里有关于堆栈溢出的解决方案

于 2013-02-26T10:51:42.540 回答