Как перемещаться из одного вида в другой вид из модели представления в Silverlight? - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть одна модель представления и два представления.Как я могу перейти к View2 из ViewModel.Я где-то читал, что нам нужно использовать PRISM для открытия нескольких представлений из ViewModel в Silverlight.Есть ли альтернатива PRISM?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

В идеале вы не хотите использовать логику представления в вашей модели представления. Ваша модель представления не должна ничего знать о представлении. Для вашей модели представления было бы лучше установить свойство, позволяющее представлению знать, что пора ориентироваться. Вот пример:

ViewModel

using System.ComponentModel;

namespace ViewModels
{
    public class MyViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged == null) return;
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        private bool _DoneDoingStuff;
        public bool DoneDoingStuff
        {
            get
            {
                return _DoneDoingStuff;
            }
            set
            {
                if (_DoneDoingStuff != value)
                {
                    _DoneDoingStuff = value;
                    NotifyPropertyChanged("DoneDoingStuff");
                }
            }
        }
    }
}

View

<navigation:Page
    x:Class="Views.MyView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    xmlns:vm="clr-namespace:ViewModels">
    <navigation:Page.Resources>
        <vm:MyViewModel
            x:Key="MyViewModelInstance" />
    </navigation:Page.Resources>
    <Grid
        x:Name="LayoutRoot"
        DataContext="{Binding Source={StaticResource MyViewModelInstance}}">
        <i:Interaction.Triggers>
            <ei:DataTrigger
                Binding="{Binding DoneDoingStuff}"
                Value="True">
                <ei:HyperlinkAction
                    NavigateUri="AnotherPage.xaml" />
            </ei:DataTrigger>
        </i:Interaction.Triggers>
    </Grid>
</navigation:Page>
  • Используйте DataTrigger со свойством Binding, для которого установлено свойство DoneDoingStuff из вашей модели представления, а для свойства Value установлено значение "True". DataTrigger сработает, когда для DoneDoingStuff из вашей модели просмотра установлено значение true.

  • Теперь вам нужно триггерное действие для навигации. Используйте HyperlinkAction со свойством NavigateUri, установленным для страницы, на которую вы переходите.

  • Обязательно наличие System.Windows.Interactivity , System.Windows.Controls.Navigation и Microsoft.Expression.Interactions сборок в ваши ссылки.

Поначалу это может показаться слишком большим, но ваша логика представления теперь там, где она должна быть.

1 голос
/ 15 февраля 2012

Вам не нужно использовать PRISM, но это может быть лучше.

Один из способов, которым я это сделал (и он небрежный), - это иметь страницу MainView с рамкой навигации, которая будет загружать первый вид при запуске.MainView должен быть Page, а не UserControl.Вам нужно иметь навигационный фрейм с отображениями uri в xaml и иметь фрейм, объявленный как shared / static в коде позади страницы MainView Page, а затем установить загруженное событие (в xaml) фрейма следующим образом:

Public Shared MainContentFrame As Frame
Private Sub MainContentFrameXaml_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs)
    MainContentFrame = TryCast(sender, Frame)
End Sub

Тогда в viewmodel вы можете просто позвонить:

MainView.MainContentFrame.Navigate(New Uri("/SecondView", UriKind.Relative))

Это, вероятно, каким-то образом нарушает шаблон MVVM и не может быть хорошим способом сделать это, но это работает.Вот как я это делал, теперь я использую ПРИЗМУ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...