MVVM页面跳转 技巧性标记

刚学MVVM 百度了很多概念性的东西 也参考了网上的例子 基本有了了解

但是我发现 我做了一个登录页面以后 我跳转咋办呢? VM里面咋做跳转? 问了一下其他的群友得到了一些启发。感谢“上海*松”

我仅在此作为标记,贴出发给我的demo。

一下是登录页面:VLoginWindow.xaml  很简单 上面就一个按钮:

<Window x:Class="ShenJingBingDemo.View.VLoginWindow"
        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:vm="clr-namespace:ShenJingBingDemo.ViewModel"
        Title="登录" Height="300" Width="300">
    <Window.DataContext>
        <vm:VMLoginWindow />
    </Window.DataContext>

    <i:Interaction.Triggers>
        <i:EventTrigger  EventName="Loaded">
            <ei:CallMethodAction TargetObject="{Binding}" MethodName="MainWindow_Loaded"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <Button Content="登录" VerticalAlignment="Center" HorizontalAlignment="Center" Width="100" Height="60">
            <i:Interaction.Triggers>
                <i:EventTrigger  EventName="Click">
                    <ei:CallMethodAction TargetObject="{Binding}" MethodName="Btn_Login_Click"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
    </Grid>
</Window>

接下来是VM: VMLoginWindow.cs  跳转到MainWindow.xaml 主面板

using System.Windows;

namespace ShenJingBingDemo.ViewModel
{
    public class VMLoginWindow : NotificationObject
    {
        #region 变量
        Window win;
        #endregion 变量

        #region 事件
        public void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            win = sender as Window;

           // e.Handled = true;
        }

        public void Btn_Login_Click(object sender, RoutedEventArgs e)
        {
            MainWindow mainwin = new MainWindow();
            win.Close();
            mainwin.ShowDialog();
            
          //  e.Handled = true;
        }


        #endregion 事件
      


    }
}

还有demo里实现响应的NotificationObject.cs

using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
namespace ShenJingBingDemo
{
    public abstract class NotificationObject : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }


        protected void RaisePropertyChanged(params string[] propertyNames)
        {
            if (propertyNames == null) throw new ArgumentNullException("propertyNames");

            foreach (var name in propertyNames)
            {
                this.RaisePropertyChanged(name);
            }
        }

        protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
        {
            var propertyName = ExtractPropertyName(propertyExpression);
            this.RaisePropertyChanged(propertyName);
        }

        public static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression)
        {
            if (propertyExpression == null)
            {
                throw new ArgumentNullException("propertyExpression");
            }

            var memberExpression = propertyExpression.Body as MemberExpression;
            if (memberExpression == null)
            {
                throw new ArgumentException("PropertySupport_NotMemberAccessExpression_Exception", "propertyExpression");
            }

            var property = memberExpression.Member as PropertyInfo;
            if (property == null)
            {
                throw new ArgumentException("PropertySupport_ExpressionNotProperty_Exception", "propertyExpression");
            }

            var getMethod = property.GetGetMethod(true);
            if (getMethod.IsStatic)
            {
                throw new ArgumentException("PropertySupport_StaticExpression_Exception", "propertyExpression");
            }

            return memberExpression.Member.Name;
        }

    }
}

代码是这么个代码,上面加的俩命名空间其实是引用

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries

下面的俩类库Microsoft.Expression.Interactions 和System.Windows.Interactivity。看样子是blend的里面的,用的时候记得添加引用。

标记一下,匆匆下班,再见各位。

 

转载于:https://www.cnblogs.com/ChinaNebula/p/4728095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MVVM(Model-View-ViewModel)是一种软件架构模式,用于支持界面(View)与业务逻辑(ViewModel)的分离。在MVVM中,界面的控制通常由ViewModel层来管理。 在MVVM中,ViewModel负责处理界面逻辑和业务逻辑。当需要进行界面时,ViewModel会通过调用命令或触发事件来通知视图(View)进行操作。具体的实现方式与开发框架和视图绑定机制有关。 在传统的MVVM开发框架中,例如WPF(Windows Presentation Foundation)或者Android的Data Binding框架中,ViewModel通过命令或事件来触发界面操作。ViewModel会包含一个表示动作的命令或事件对象,当某个条件满足时,ViewModel会执行该命令或触发该事件,以通知视图进行。 在具体的代码实现中,可以使用命令绑定机制将ViewModel中的命令与视图中的按钮或触发器关联起来。当按钮被点击或触发器被触发时,命令会在ViewModel中被执行,进而实现界面的。 总之,在MVVM中,界面的控制是由ViewModel层来处理的。ViewModel会通过命令或事件的方式通知视图进行操作。具体的实现方式与开发框架和视图绑定机制有关。 ### 回答2: MVVM (Model-View-ViewModel) 是一种用于构建用户界面的软件架构模式。在MVVM中,ViewModel是连接View(界面)和Model(数据)之间的桥梁,负责处理界面的逻辑和数据的交互。MVVM中的界面主要通过ViewModel来实现,下面是一个简单的示例来说明界面的过程: 在MVVM中,界面是通过命令(Command)来触发的。在ViewModel中,我们可以定义一个命令,例如"到下一页"的命令。当用户在View中执行了相应的操作(例如点击一个按钮),View会将这个命令发给ViewModel。 在ViewModel中,我们可以处理这个命令,并执行相应的逻辑。一种常见的方式是使用导航服务(Navigation Service)来实现界面。导航服务可以提供诸如导航到另一个页面、传递参数等功能。 在执行界面之前,我们可以在ViewModel中对进行一些逻辑判断和处理。例如,可以检查用户的输入是否合法,或者根据当前的应用状态来确定应该到哪个页面。 在ViewModel中执行界面的方式因框架和库的不同而有所不同。在一些框架中,我们可以直接调用导航服务进行界面,例如`NavigationService.NavigateTo("NextPage", parameter);`。在其他框架中,我们可能需要使用特定的导航命令或者路由来实现界面。 总结起来,MVVM中的界面主要通过ViewModel来处理,通过命令触发逻辑,并使用导航服务进行实际的页面导航。通过这种方式,我们可以将界面的逻辑和数据交互与界面的具体实现解耦,使得代码更容易维护和测试。 ### 回答3: MVVM(Model-View-ViewModel)是一种软件架构模式,用于将应用程序的用户界面(View)与业务逻辑和数据(Model)分开,并通过ViewModel来实现它们之间的交互。在MVVM中,ViewModel起到承上启下的作用,负责处理View与Model之间的数据传递和交互逻辑。 在MVVM中,界面是通过ViewModel来实现的。当View中需要进行页面时,可以通过ViewModel中的命令(Command)来触发动作。ViewModel中可以定义一个命令,当该命令被触发时,ViewModel会根据条件和需要传递的参数进行相应的处理,并将目标页面(View)告诉View。 具体实现方案可以是通过使用框架提供的导航服务(如WPF的NavigationService或UWP的Frame)来进行页面导航,也可以通过调用View的导航方法来实现。无论是哪种方式,ViewModel都需要知道的目标页面和相应的导航参数,这些信息通常以属性或者参数的形式传递给ViewModel,由ViewModel进行处理和调用。 在MVVM中,界面的触发条件可以是用户交互(如按钮点击)、数据响应(如数据加载完成后自动)等。需要注意的是,ViewModel应该尽量避免直接依赖具体的View实现,而是通过抽象接口与View进行交互,以便实现View的替换或重用。 总之,MVVM中的界面是通过ViewModel来实现的,通过定义命令和传递相应的参数,ViewModel可以告知View需要到哪个页面以及如何进行。这种方式使得View能够专注于展示和用户交互,而将业务逻辑和数据处理交由ViewModel来完成,实现了界面与逻辑的解耦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值