0

私は位置情報ベースのサービス Windows Phone アプリを構築していますが、これは私の最初のアプリです。MVVM Light を使用したページ ナビゲーションに問題があります。私はJesse Liberty Tutorialに従っていますが、これまでのところ、FirstPage の ListBox のアイテムをクリックすると、SecondPage に移動できます。

ListBox私がやりたいことFirstPageListPickerSecondPage. そのため、ユーザーは検索対象を簡単に変更できますSecondPage

ここに画像の説明を入力

MainPage.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)));
}

MainViewModel.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}" />

誰でも私の問題を解決できることを願っています。

会場リストViewModel

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

これは、相互に通信するために 2 つの ViewModel が必要な典型的なケースです。

そのような状況では、フレームワークの機能mvvm-lightを使用することが最善の方法です。Messaging

その上で支援が必要な場合は、Web で多くの例とドキュメントを見つけることができます (channel9 で Laurent Bugnion の Web キャストを探してください。たとえば、this one )。実際には、特定のタイプのコールバックを登録するだけです。メッセージを別の場所から送信します。

そうすれば、最初のビューモデルは、どのリスト項目が選択されたかを示すメッセージを 2 番目のビューモデルに送信します。ターゲット ビューモデルは、これを反映するように更新されます。次に、最初のビューモデル コマンドがターゲット ページに移動し、ターゲット ビューモデルを使用するため、うまく機能します。

于 2013-02-25T20:44:05.493 に答える
0

いくつかの可能性があります。私は主にリストボックスの SelectedItem ソリューションを使用していますが、純粋なメッセージングも可能です。

スタックオーバーフローに関する解決策と同様の質問を見てください

于 2013-02-26T10:51:42.540 に答える