Windows 8实用窍门系列:21.Windows 8 下进行MVVM开发

简介:

在本文中将演示如何在Windows 8进行MVVM开发,首先我们准备两个辅助类如下:

  ViewModeBase类:

复制代码
    public class ViewModeBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 属性变化时触发事件
        /// </summary>
        /// <param name="propertyName"></param>
        protected void OnPropertyChanged( string propertyName )
        {
            var handler = this.PropertyChanged;
            if ( handler != null )
            {
                handler( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }
    }
复制代码

  DelegateCommand类:

复制代码
   public class DelegateCommand : ICommand
    {
        private readonly Action m_exeAction;
        private readonly Func<bool> m_canExeAction;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="executeAction"></param>
        /// <param name="canExecuteAction"></param>
        public DelegateCommand(Action executeAction, Func<bool> canExecuteAction)
        {
            m_exeAction = executeAction;
            m_canExeAction = canExecuteAction;
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="executeAction"></param>
        /// <param name="canExecuteAction"></param>
        public DelegateCommand(Action executeAction)
            : this(executeAction, null)
        {
        }
        /// <summary>
        /// 判断是否执行操作
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            if (m_canExeAction != null)
            {
                return m_canExeAction();
            }
            return true;
        }
        /// <summary>
        /// 是否执行操作的变更发生时
        /// </summary>
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 执行操作的内容,可以变为Action行为
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            if (CanExecute(parameter))
            {
                m_exeAction();
            }
        }

        protected void OnCanExecuteChanged(object sender, EventArgs args)
        {
            var handler = CanExecuteChanged;
            if ( handler != null )
            {
                handler( this, EventArgs.Empty );
            }
        }

        public void RaiseCanExecuteChanged()
        {
            OnCanExecuteChanged(this, EventArgs.Empty);
        }
    }
复制代码

  Model层如下:

复制代码
    /// <summary>
    /// 图片Model
    /// </summary>
    public class BookModel : ViewModeBase
    {
        private string txtTitle;
        private string txtContent;
        private string imageUrl;
        private bool isSelect;

        /// <summary>
        /// 标题
        /// </summary>
        public string TxtTitle
        {
            get { return txtTitle; }
            set
            {
                txtTitle = value;
                OnPropertyChanged("TxtTitle");
            }
        }

        /// <summary>
        /// 内容
        /// </summary>
        public string TxtContent
        {
            get { return txtContent; }
            set { 
                txtContent = value;
                OnPropertyChanged("TxtContent");
            }
        }

        /// <summary>
        /// 图片URL地址
        /// </summary>
        public string ImageUrl
        {
            get { return imageUrl; }
            set
            {
                imageUrl = value;
                OnPropertyChanged("ImageUrl");
            }
        }
    }
复制代码

  ViewModel层代码如下:

复制代码
    public class MainPageViewModel:ViewModeBase
    {
        private ICommand getTextCommand;
        private ICommand btnCommand;
        private string showText;
        private string getText;

        ObservableCollection<BookModel> books = new ObservableCollection<BookModel>(){
                        new BookModel(){ TxtTitle="盘龙",TxtContent="大小的血睛鬃毛狮,力大无穷的紫睛金毛猿,毁天灭地的九头蛇皇,携带着毁灭雷电的恐怖雷龙这里无奇不有,这是一个广博的魔幻世界。", ImageUrl="http://image.qidian.com/books/1017141/1017141.jpg" },
                        new BookModel(){ TxtTitle="纵横轮回",TxtContent="李沐然,本为身怀诸子百家所长的大神通者,在收取世间最后一颗神雷珠之时和神雷珠一道重生异世神雷之力,刑罚天下", ImageUrl="http://image.qidian.com/books/1.jpg" },
                        new BookModel(){ TxtTitle="巫师世界",TxtContent="穿越到异世界成为普通的小家族子弟,带着具有分析能力的生物芯片开始强大之旅..... ", ImageUrl="http://image.qidian.com/books/2443169/2443169.jpg" },
                        new BookModel(){ TxtTitle="杀神",TxtContent="在这个人吃人的疯狂世界,神已无力回天,就让我踏着漫天诸神的累累尸骨来普渡这芸芸众生……", ImageUrl="http://image.qidian.com/books/1911245/1911245.jpg" }
                    };
        public ICommand GetTextCommand
        {
            get { return getTextCommand; }
            set { getTextCommand = value; }
        }

        public ICommand BtnCommand
        {
            get { return btnCommand; }
            set { btnCommand = value; }
        }

        public string ShowText
        {
            get { return showText; }
            set
            {
                showText = value;
                OnPropertyChanged("ShowText");
            }
        }
        public string GetText
        {
            get { return getText; }
            set
            {
                getText = value;
                OnPropertyChanged("GetText");
            }
        }
        public MainPageViewModel()
        {
            BtnCommand = new DelegateCommand(Btn_Executed);
            GetTextCommand = new DelegateCommand(GetText_Executed);
        }

        private void GetText_Executed()
        {
            GetText = "'" + ShowText + "'是我获取到的值";
        }

        private void Btn_Executed()
        {
            ShowText = "您已经点击了按钮,请在这里输入值";
        }
        public ObservableCollection<BookModel> Books { get { return books; } }
    }
复制代码

  最后View层代码如下:

复制代码
    <Page.DataContext>
        <local:MainPageViewModel />
    </Page.DataContext>
    
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Button Command="{Binding BtnCommand}" Content="点击我" Padding="8"
                Margin="72,138,0,494" Height="60" Width="100" Grid.Row="0"/>
        <TextBox   Name="tbshow" Height="60" Text="{Binding ShowText,Mode=TwoWay}" Margin="230,176,744,532"/>
        <GridView x:Name="mainGridView" ItemsSource="{Binding Books}"  VerticalAlignment="Center" Grid.Row="1">
            <GridView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </GridView.ItemsPanel>
            <GridView.ItemTemplate>
                <DataTemplate>
                    <Grid Width="250" Height="200" Background="#33CCCCCC">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="110"></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Margin="5,0,0,0" Source="{Binding ImageUrl}" Stretch="None"></Image>
                        <TextBlock Grid.Column="1" Margin="15,15,0,0" Foreground="White" Text="{Binding TxtTitle}"
                                    FontWeight="Bold" FontSize="18" TextWrapping="Wrap"/>
                        <TextBlock Grid.Column="1" Margin="15,40,0,0" Foreground="White" Text="{Binding TxtContent}"
                                    FontWeight="Light" FontSize="13" TextWrapping="Wrap"/>
                    </Grid>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>
        <Button Command="{Binding GetTextCommand}" Content="点击我获取值" Padding="8" 
                Margin="667,176,0,532" Height="60" Width="123" Grid.Row="0"/>
        <TextBlock HorizontalAlignment="Left" Margin="795,198,0,0" TextWrapping="Wrap"
                   Text="{Binding GetText,Mode=TwoWay}" VerticalAlignment="Top"
                   Height="22" Width="379"/>
    </Grid>
</Page>
复制代码
本文转自程兴亮博客园博客,原文链接: http://www.cnblogs.com/chengxingliang/archive/2013/03/25/2977195.html ,如需转载请自行联系原作者
相关文章
|
11月前
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
1210 1
|
11月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
431 0
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
328 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
12月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
672 0
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
1362 0
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
250 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
Java Nacos 微服务
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册