【问题标题】:How to navigate from one view to another view from viewmodel in silverlight?如何从silverlight中的视图模型从一个视图导航到另一个视图?
【发布时间】:2012-02-14 20:05:29
【问题描述】:

我有一个 ViewModel 和两个 View。如何从 ViewModel 导航到 View2。我在某处读到我们需要使用 PRISM 来从 Silverlight 中的 ViewModel 打开多个视图。 PRISM 有什么替代品吗?

【问题讨论】:

  • “打开视图”是什么意思?你想只是导航到那里还是什么?
  • 是的!从一个视图导航到另一个视图。

标签: silverlight mvvm view viewmodel


【解决方案1】:

理想情况下,您不想在视图模型中使用视图逻辑。您的视图模型不应该对视图一无所知。对于您的视图模型来说,设置一个属性让视图知道是时候导航会是一个更好的主意。 这是一个例子:

视图模型

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");
                }
            }
        }
    }
}

查看

<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.InteractivitySystem.Windows.Controls.NavigationMicrosoft.Expression.Interactions > 参考文献中的程序集。

起初,这可能看起来太多了,但您的视图逻辑现在是它需要的地方。

【讨论】:

    【解决方案2】:

    您不需要使用 PRISM,但它可能是最好的。

    我完成它的一种方法(而且它很草率)是有一个 MainView 页面,其中有一个 Navigation 框架,它将在启动时加载第一个视图。 MainView 必须是 Page 而不是 UserControl。您需要在 xaml 中有一个带有 uri 映射的导航框架,并在 MainView 页面后面的代码中声明为 shared/static 的框架,然后像这样设置框架的加载事件(在 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
    

    然后在视图模型中你可以调用:

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

    这可能在某种程度上违反了 MVVM 模式,可能不是一个好方法,但它确实有效。这就是我以前的做法,现在我使用 PRISM。

    【讨论】:

    • @user672094 如果有帮助,请将我的答案标记为答案...我喜欢这个代表!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多