WPF入门教程系列(5)

本文详细介绍了如何使用MVVM模式和C#语言创建一个简单的应用程序,包括实体对象的定义、ViewModel的编写以及View的展示。通过实例展示了ObservableObject的使用,以及如何通过属性更改通知UI更新。

很简单,仅仅是包含一个实体对象,这边注意的的是那他继承了一个父类:ObservableObject,这个父类的作用就是保证能够检测属性是否被改变。其实在继承的过程中,可能会遇到一个问题:ObservableObject无法被继承,解决方案是加一个using GalaSoft.MvvmLight;命名空间。ObservableObject实现了INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的;所以我们在定义实体对象的时候,只需要调用RaisePropertyChanged(PropertyName)就可以进行属性更改通知了。所以实体里面定义的每个属性都加上RaisePropertyChanged(PropertyName)的调用,就可以实现对UI的交互更新了。

2、写一个VideModel,来负责跟View的交互。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GalaSoft.MvvmLight;
using MvvmLight1.Model;

namespace MvvmLight1.ViewModel
{
    class WelcomeViewModel:ViewModelBase
    {
        public WelcomeViewModel()
        {
            //welcome = new WelcomeModel() { Introduction="Hello World!"};
            welcome = new WelcomeModel();
            welcome.Introduction = "Hello World!";
        }

        #region 属性
        private WelcomeModel welcome;
        public WelcomeModel Welcome
        {
            get { return welcome; }
            set { welcome = value;RaisePropertyChanged(() => Welcome); }
        }
        #endregion
    }
}

在敲代码的过程中,我发现c#和c++很相似,c++中的#include和c#中的using 是一个意思,在当前类中调用另一个文件中的属性(类似c++中的成员函数)方法是首先要包含源文件中命名空间,然后在当前类中实例化一个对象,并new,最后用当前的实例化对象调用其他文件中的属性并赋值。

此代码也很简单,包含了一个命名为Welcome的WelcomeModel属性,继承了ViewBaseModel父类,ViewBaseModel同时继承 ObservableObject类和ICleanup接口。所以他同样有INotifyPropertyChanged接口的能力,能够通过触发PropertyChanged事件达到通知View的目的;

构造函数中对 Welcome 属性进行了实例化。

3、写一个View,来显示和交互ViewModel。

每一个View其实就是一个MainWindow。如果你新建的工程中没有View文件夹,你可以选择在当前工程下右击“添加”-》新建文件夹,将此文件更名为View。

在view下鼠标右键“添加”-》“新建项”-》“窗口”,影子随意更改,注意更改名字时不要随意删除后缀名,这时会出现一个窗体:

修改WelcomeView.xaml中的代码

    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" >
            <TextBlock Text="{Binding Welcome.Introduction}" FontSize="30" ></TextBlock>
        </StackPanel>
    </Grid>

extBlock 绑定了 Welcome.Introduction,所以应该显示Welcome对象下的Introduction属性。

这时候的ViewModel和View是没有任何关系的,所以我们在code-Behind的构造函数中写上如下代码(在WelcomeView.xaml.cs文件中修改):

using MVVMLightDemo.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace MVVMLightDemo.View
{
    /// <summary>
    /// WelcomeView.xaml 的交互逻辑
    /// </summary>
    public partial class WelcomeView : Window
    {
        public WelcomeView()
        {
            InitializeComponent();
            this.DataContext = new WelcomeViewModel();
        }
    }
}

把 WelcomeViewModel 赋值给当前视图的数据上下文。所以可以在当前视图中使用ViewModel中所有的公开属性和命令。

执行效果如下

如果你的运行结果和上图不一样,即仍然是工程自带的效果图,你可以尝试用如下方法修改:

前面讲过,StartupUri用于指定启动窗口,因此只要修改要启动的窗口即可。注意这里的View是工程下的文件夹,如果你的*.xaml与MainWindow在同一级下,就不用带View。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值