一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

WPF中使用MVVM創(chuàng)建一個(gè)簡(jiǎn)單的框架

 阿修羅之獅猿授 2016-03-28

MVVM模式

一、MVVM模式概述

MVVM Pattern : Model\View\ViewModel

View:視圖、UI界面

ViewModel:ViewModel是對(duì)Model的封裝,通過(guò)一系列屬性暴露Model的狀態(tài),提供給View進(jìn)行顯示

Model:數(shù)據(jù)模型

使用MVVM模式可以將代碼邏輯和UI進(jìn)行分離,因此開(kāi)發(fā)團(tuán)隊(duì)可以關(guān)注創(chuàng)建健壯的ViewModel類(lèi),而設(shè)計(jì)團(tuán)隊(duì)可以關(guān)注設(shè)計(jì)界面友好的View。要融合兩個(gè)團(tuán)隊(duì)輸出只需要在View的xaml上進(jìn)行正確的綁定即可。

二、演示程序

下面通過(guò)一個(gè)Demo演示W(wǎng)PF中如何使用MVVM模式:使用WPF中的data template、commands、data binding、resource結(jié)合MVVM模式,創(chuàng)建一個(gè)簡(jiǎn)單、可測(cè)試、健壯的框架。

演示程序結(jié)構(gòu)圖如下:

1、演示程序 Demo界面如圖所示:

工作區(qū)用于顯示視圖

命令區(qū)分兩部分,上部分為顯示單視圖命令,下部分為顯示多視圖命令

單視圖:工作區(qū)始終只顯示一個(gè)視圖。

多視圖:工作區(qū)可以顯示多個(gè)視圖,以TabControl控件的TabItem進(jìn)行展示。可以通過(guò)previousview命令顯示視圖集合中的上一個(gè)視圖,通過(guò)nextview顯示視圖集合中的下一個(gè)視圖。

Demo的MainWindow.xaml文件中,使用單視圖時(shí),需要注釋多視圖;使用多視圖時(shí),需要注釋單視圖。代碼如下:

<!--single view-->
<ContentPresenter Content="{Binding Path=WorkspaceSingle}"/>

<!--multi view-->
<ContentPresenter Content="{Binding Path=WorkspaceMulti}" ContentTemplate="{StaticResource WorkspacesTemplate}"/>

三、數(shù)據(jù)模型(Model)、視圖(View)

為了使Demo更容易理解,程序中只使用了一個(gè)Model,Model中Name屬性用于顯示視圖名稱(chēng)。

public class InfoModel
{
    //視圖名稱(chēng)
    public string Name { get; set; }
}

兩個(gè)簡(jiǎn)單的視圖:FirstView、SecondView,視圖中控件顯示當(dāng)前的視圖名稱(chēng),如視圖FirstView:

<StackPanel Background="Aqua">
    <TextBlock Text="{Binding Path=Name}" FontSize="20"/>
</StackPanel>

<StackPanel Background="Chartreuse">
    <TextBlock Text="{Binding Path=Name}" FontSize="20"/>
</StackPanel>

在實(shí)際開(kāi)發(fā)中,視圖中可以布局其它控件,并進(jìn)行正確的綁定,界面都能正常的顯示。

顯示多視圖時(shí),TabItem的Header能顯示視圖名稱(chēng),如圖所示:

視圖名稱(chēng)DisplayName是基類(lèi)ViewModelBase的屬性

/// <summary>
/// 名稱(chēng)
/// </summary>
public virtual string DisplayName { get; protected set; }

子類(lèi)在構(gòu)造函數(shù)中給DisplayName賦值

public class FirstViewModel : WorkspaceViewModel
{
    private const string DisplayViewName = "FirstView";

    private readonly InfoModel _info;

    public FirstViewModel()
    {
        //視圖名稱(chēng)
        base.DisplayName = DisplayViewName;

        if (_info == null)
        {
            _info = new InfoModel();
        }
        _info.Name = DisplayViewName;
    }

    public string Name
    {
        get { return _info.Name; }
    }
}

在View中綁定視圖名稱(chēng)

<DataTemplate x:Key="TabItemTemplate">
    <DockPanel>
        <ContentPresenter Content="{Binding Path=DisplayName}" VerticalAlignment="Center"/>
    </DockPanel>
</DataTemplate>

四、ViewModel類(lèi)圖

大家一看代碼就知道,整個(gè)ViewModel使用的是什么設(shè)計(jì)模式

五、View對(duì)應(yīng)ViewModel

Demo的一個(gè)主要特點(diǎn)是數(shù)據(jù)延遲加載,即在需要數(shù)據(jù)時(shí)創(chuàng)建ViewModel

程序在啟動(dòng)時(shí)即為主界面加載數(shù)據(jù)MainWindowViewModel

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MainWindow window = new MainWindow();
        var viewModel = new MainWindowViewModel();
        window.DataContext = viewModel;
        window.Show();
    }
}

程序啟動(dòng)后,單擊按鈕時(shí)創(chuàng)建FirstViewModel或SecondViewModel

創(chuàng)建單視圖

/// <summary>
/// 顯示視圖一
/// </summary>
private void ShowFirstView()
{
    if (_workspaceStory == null)
    {
        _workspaceStory = new ObservableCollection<WorkspaceViewModel>();
    }

    var model =
        this._workspaceStory.FirstOrDefault(vm => vm is FirstViewModel)
            as FirstViewModel;

    if (model == null)
    {
        model = new FirstViewModel();
        _workspaceStory.Add(model);
    }

    WorkspaceSingle = model;
}

/// <summary>
/// 顯示視圖二命令
/// </summary>
private void ShowSecondView()
{
    if (_workspaceStory == null)
    {
        _workspaceStory = new ObservableCollection<WorkspaceViewModel>();
    }

    var model =
        this._workspaceStory.FirstOrDefault(vm => vm is SecondViewModel)
            as SecondViewModel;

    if (model == null)
    {
        model = new SecondViewModel();
        _workspaceStory.Add(model);
    }

    WorkspaceSingle = model;
}

創(chuàng)建多視圖

/// <summary>
/// 創(chuàng)建視圖一,并顯示
/// </summary>
private void CreateFirstView()
{
    var model = new FirstViewModel();
    WorkspaceMulti.Add(model);
    ShowCurrentView(model);
}

/// <summary>
/// 創(chuàng)建視圖二
/// </summary>
private void CreateSecondView()
{
    var model = new SecondViewModel();
    WorkspaceMulti.Add(model);
    ShowCurrentView(model);
}

創(chuàng)建后,WPF自動(dòng)為匹配的View Model尋找View來(lái)渲染。

<DataTemplate DataType="{x:Type vm:FirstViewModel}">
    <vw:FirstView/>
</DataTemplate>

<DataTemplate DataType="{x:Type vm:SecondViewModel}">
    <vw:SecondView/>
</DataTemplate>

六、總結(jié)

MVVM模式是設(shè)計(jì)和開(kāi)發(fā)WPF程序一種簡(jiǎn)單、有效的指導(dǎo)方針。它允許你創(chuàng)建數(shù)據(jù)、行為和展示強(qiáng)分離的程序,更容易控制軟件開(kāi)發(fā)中的混亂因素。


Demo:https://github.com/WELL-E/TestMVVMDemo QQ:130108655共同學(xué)習(xí)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    少妇人妻精品一区二区三区| 国产精品免费不卡视频| 亚洲av熟女国产一区二区三区站| 日系韩系还是欧美久久| 久久青青草原中文字幕| 国产亚洲精品岁国产微拍精品| 国产内射一级二级三级| 亚洲熟女一区二区三四区| 国产又长又粗又爽免费视频| 中文字幕精品一区二区年下载| 亚洲午夜福利视频在线| 精品熟女少妇av免费久久野外| 国产精品十八禁亚洲黄污免费观看 | 办公室丝袜高跟秘书国产| 中文字幕久热精品视频在线| 精品一区二区三区中文字幕| 护士又紧又深又湿又爽的视频| 欧美午夜一级特黄大片| 91欧美一区二区三区| 精品国自产拍天天青青草原| 91插插插外国一区二区| 日韩一区二区三区在线欧洲| 欧美日韩三区在线观看| 精品久久久一区二区三| 91精品日本在线视频| 日本国产欧美精品视频| 欧美精品一区久久精品| 99精品国产一区二区青青| 欧美日韩精品视频在线| 日韩av欧美中文字幕| 亚洲一区二区三区三州| 亚洲国产91精品视频| 日韩精品区欧美在线一区| 日韩亚洲精品国产第二页| 亚洲中文字幕高清视频在线观看| 久久精品国产在热久久| 日韩女优精品一区二区三区| 欧美一区二区三区喷汁尤物| 自拍偷拍一区二区三区| 黄色激情视频中文字幕| 国产精品国三级国产专不卡|