精华内容
下载资源
问答
  • wpf教程(从入门到高手)

    热门讨论 2010-04-21 16:18:11
    WPF教程内容涉及元素的布局、控件模型、控件内容模型、焦点处理、依赖项属性、路由事件、WPF命令、WPF样式与模板、WPF资源、图形的使用、数据的绑定、三维、动画等。内容丰富,有难有易。代码经过我精心调试,都...
  • WPF视频教程

    2019-07-26 08:02:27
    全网最全的WPF开发视频教程,包括基础和进阶两部分,资源大约6G
  • WPF教程_视频_源码.txt

    2020-04-08 11:49:14
    最近在做这块的东西,网上找到的WPF视频教程,比较全面,设置为0积分,为了大家的学习和交流。也是为了以后自己查找方便。
  • WPF全套高级视频教程

    2020-04-01 13:46:31
    WPF高级视屏教程(7个G) 适合于基础较好的同学
  • 资源名称:微软官方WPF视频教程(11讲)资源目录:【】Chapter10ADDINGINTERACTIVITY【】Chapter11USINGSKETCHFLOW【】Chapter1INTRODUCTIONTOUR【】Chapter2HELLOWORLD【】Chapter3VISUALDESIGN【】Chapter4...
  • wpf经典入门教程.pdf

    2020-12-22 16:52:57
    wpf入门教程。在学校了解过wpf但是并没有项目经验,拿来学,非常适合想要入门wpf开发并且有C#编程基础的童鞋
  • WPF教程.txt

    2019-09-15 18:39:34
    WPF视频教程,适合初学者,适合想提高开发能力的中高级开发人员
  • c# wpf全套教程视频教程下载

    热门讨论 2017-10-30 17:20:42
    C#WPF基础教程【50课全】高级教程 视频教程 教学视频 百度云网盘 公开课 全集下载
  • WPF是微软新一代开发技术,涵盖了桌面应用程序开发、网络应用程序开发和移动应用程序开发,是微软开发技术未来十年的主要方向。
  • 微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……。这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、DependencyProperty、RoutedEvents、Command、...
  • 本文介绍了WPF应用程序的基础知识,如何处理布局,控件的位置和位置。
  • WPF视频教程(比较全)

    2018-12-16 23:07:26
    WPF视频教程,保证好用,设置2分.大家一块学习,相互促进.
  • WPF中使用转换的简要介绍
  • csharp c# wpf(传智)全套教程视频教程下载,有需要的同学赶快下载吧!
  • WPF教程 XAML教程

    2013-09-06 08:48:08
    wfp从零开始,xaml从零开始学习,以及mvvm设计模式
  •         前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识。提到DataGrid 不管是Asp.Net...本篇将学习WPF中的DataGrid 相关功能。   ...

            前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识。提到DataGrid 不管是Asp.Net中的网页开发还是WinForm应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将学习WPF中的DataGrid 相关功能。
            首先,先介绍一下DataGrid中有哪些列的类型。
    DataGrid列的类型
            默认情况下,当我们为DataGrid 控件设置ItemSource 属性后,DataGrid 会根据数据类型自动生成相应的列,下表列出DataGrid 支持的四种列及其数据类型。
            下表列出了 DataGrid 提供的四个列类型。

    列类型显示数据数据类型
    DataGridHyperlinkColumn使用显示 URI 数据。URI
    DataGridComboBoxColumn使用显示枚举数据与其他需要下拉框选择的数据。Enum,String
    DataGridTextColumn使用显示文本String
    DataGridCheckBoxColumn使用显示布尔数据Bool

            在创建DataGrid 时可以通过AutoGenerateColumns 属性设置列是否自动生成,从而加入自定义列。如果DataGrid 中同时包含“自动生成列”与“用户自定义列”,则首先创建“用户自定义列”。如下图。
    在这里插入图片描述
    其次:我们来做一个示例,学习如何使用DataGrid。
    制做DataGrid示例的界面

    1. 按照上一篇文章中所写的步骤,使用Visual Studio 2013创建一个WindowGrid界面。如下图。
      在这里插入图片描述
    2. 在Visual studio 2013中的工具箱中,找到DataGrid控件,然后双击。把DataGrid控件添加窗体界面中。如下图1,图2。注意,图2中的红框所标示的那个小框,就是DataGrid控件,是不是与WindowForm中的DataGrid有很大的不同呀。
      在这里插入图片描述
                                   图1
      在这里插入图片描述
                                                                                             图2
    3. 给DataGrid添加列。先鼠标左键选中,窗体界面中的小方块,然后点击Visual Studio 2013最右边的“属性”标签,然后Visual Studio 2013会弹出“属性”编辑窗口。如下图。
      在这里插入图片描述
    4. 在上图中使用鼠标左键点击Columns那一行的按钮。如上图中的红色框,然后会弹出一个对话框,如下图。
      在这里插入图片描述
    5. 在上图中,选择相应的列的类型,然后点击“添加”按钮,添加列。如下图。
      在这里插入图片描述
    6. 根据我这个示例的实际情况,我根据需要我添加了5列DataGridTextColumn,和一列DataGridComboBoxColumn。添加完成之后,如下图。看起来与WindowForm中的DataGrid很像了吧。
      在这里插入图片描述
    7. 下面是全部完成之后的实际的XAML代码。
      <Window x:Class="WpfApp1.WindowGrid"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="Grid示例" Height="400" Width="600">
          <Grid>
              <Grid.RowDefinitions>
                  <RowDefinition Height="*"/>
                  <RowDefinition Height="auto"/>
                  <RowDefinition Height="22"/>
              </Grid.RowDefinitions>
              <DataGrid x:Name="gridCitys"  Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False">
                  <DataGrid.Columns> 
                      <DataGridTextColumn Binding="{Binding CityID}" ClipboardContentBinding="{x:Null}" Header="CityID"/>
                      <DataGridTextColumn Binding="{Binding CityName}" ClipboardContentBinding="{x:Null}" Header="CityName"/>
                      <DataGridTextColumn Binding="{Binding ZipCode}" ClipboardContentBinding="{x:Null}" Header="ZipCode"/>
                      <DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" > 
                      </DataGridComboBoxColumn>
                      <DataGridTextColumn Binding="{Binding DateCreated}" ClipboardContentBinding="{x:Null}" Header="DateCreated"/>
                      <DataGridTextColumn Binding="{Binding DateUpdated}" ClipboardContentBinding="{x:Null}" Header="DateUpdated"/> 
                  </DataGrid.Columns>
              </DataGrid>
              <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" >
                  <TextBlock Text="显示信息" TextAlignment="Center"  />
                  <TextBox Name="txtMsg" IsReadOnly="True" Text="" Width="320" TextAlignment="Center" />                      
              </StackPanel>
              <WrapPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right">
                  <Button  HorizontalAlignment="Right"  Name="btnRefresh" Height="22" VerticalAlignment="Top" Width="65" Click="btnRefresh_Click">刷新</Button>
                  <Button  HorizontalAlignment="Right"  Name="btnUpdate" Height="22" VerticalAlignment="Top" Width="65" Click="btnUpdate_Click"  >更新</Button>
              </WrapPanel>
          </Grid>
      </Window>
      

    DataGrid示例的后台代码

    1. 通过Entity Framework 6.1 从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,从S_ Province表中读取省份信息,然后通过绑定的方式反数据显示到WPF的Window上的一个DataGrid上。具体代码如下。
      using System;
      using System.Collections.Generic;
      using System.Collections.ObjectModel;
      using System.Data.Entity;
      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;
      using WpfApp1.Models;
       
      namespace WpfApp1
      {
          /// <summary>
          /// WindowGrid.xaml 的交互逻辑
          /// </summary>
          public partial class WindowGrid : Window
          {
              public WindowGrid()
              {
                  InitializeComponent();
                  Database.SetInitializer<TestDBContext>(null);
              }
              private void btnRefresh_Click(object sender, RoutedEventArgs e)
              {
                  BindDrp();
                  GetData();         
              }
              TestDBContext db = new TestDBContext();
              protected void GetData()
              {          
                  List<S_City> list = db.S_City.ToList<S_City>();
                  gridCitys.ItemsSource = list;           
              }
              protected void BindDrp()
              {
                  List<S_Province> list = db.S_Province.ToList<S_Province>();
                  cboProvince.ItemsSource = list;
                  ProvinceList = list;
              }
              public List<S_Province> ProvinceList
              { get; set; }        
              private void btnUpdate_Click(object sender, RoutedEventArgs e)
              {
                  try
                  {
                      S_City city = (S_City)gridCitys.SelectedItem;
                      city.DateUpdated = DateTime.Now;
                      txtMsg.Text = city.ProvinceID + "//" + city.CityName;
                      S_City modifyCity = db.S_City.Find(city.CityID);
                      modifyCity = city;
                      db.SaveChanges();
                      txtMsg.Text += "保存成功!";
                  }
                  catch (Exception ex)
                  {
                      txtMsg.Text += ex.Message;               
                  }        
              }
          }
      }
      
    2. 写完了上面的代码之后,按F5,程序运行了起来,点“刷新”。你会看到如下结果。如下图的结果。
      在这里插入图片描述
    3. DataGrid自动生成了一些列,而实际上我们是不需要这些自动生成列的。所以需要把AutoGenerateColumns设为False。再执行第2步。就会看到如下的结果。
      在这里插入图片描述
    4. 虽然实现了下拉框的内容显示,但是却存在一个问题,继不显示应该显示的内容。最后查询网络之后才知道,应许做如下修改。

    DataGrid的ComboBox列的绑定方式
            DataGridComboBoxColumn对数据源有下面的要求:
            使用下列选项之一,若要填充下拉列表,首先设置 ComboBox 的 ItemsSource 属性:
             (1)静态资源。有关更多信息,请参见 StaticResource 标记扩展。
             (2)x: 静态代码实体。有关更多信息,请参见 x:Static 标记扩展。
             (3)ComboBoxItem 类型的内联集合。

    1. 在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这根本就不能用。

    2. 默认刷新按钮之后,下拉框中没有数据。我仔细看了一下代码,前台代码中并没有进行数据绑定,而且后台代码中也没写绑定的语句。前台代码如下。如果如下图。

      <DataGridComboBoxColumn ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
      

      在这里插入图片描述

    3. 我对程序进行了一些修改,前台代码不做修改,还是如下。

      <DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
      

      后台代码如下,进行了下拉框的绑定。

      protected void BindDrp()
      {
          List<S_Province> list = db.S_Province.ToList<S_Province>();
          cboProvince.ItemsSource = list;
      }
      

      结果如下图。绑定是成功了,但是不显示我需要显示的值。

      在这里插入图片描述

    4. 对前台代码进行了如下修改。对DataGridComboBoxColumn进行了绑定。然后F5,运行发现,下拉框的显示是正常了,但是不论我怎么改,DataGrid中的“ProvinceID”默认只是显示空白,什么也不显示,如下图。前台代码如下。

      <DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValuePath="ProvinceID" DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" TextBinding="{Binding ProvinceName}"/>
      

      在这里插入图片描述

    5. 但是当我加载数据到DataGrid中时,ProvinceID列默认还是为空,并没有显示我想显示的省份名称这样的数据。经过一番的查找与学习,最终把前台代码修改成如下。这样修改之后在DataGrid默认绑定数据之后,ProvinceID列达到了我想要的结果。如下图。

      <DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" >
      </DataGridComboBoxColumn>
      

      在这里插入图片描述

    DataGrid的选择模式
            默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改DataGrid 的选择模式。
    在这里插入图片描述
    SelectionUnit的选择模式。

    成员名称说明
    Cell选择单元格。单击单元格选中单元格。 单击任何行或列标题不执行。
    FullRow选择全行。 单击单元格或行标题可以选择整行。
    CellOrRowHeader可选择单元格,也可以通过点击行首选择全行

    SelectionMode的选择模式。分为Extended 和Single 两种模式。

    成员名称说明
    Extended选择多个单元(单元格或全行,由SelectionUnit 定义)
    Single选择唯一单元(单元格或全行,由SelectionUnit 定义)

            设置SelectionUnit 和SelectionMode 后的实例效果,如下图。

     <DataGrid x:Name="gridCitys"  Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False" SelectionUnit="Cell" SelectionMode="Extended">
    

    在这里插入图片描述
    DataGrid的编辑方式

            默认情况下,我们可以直接在DataGrid 中编辑数据(下表为相关的编辑命令),当然也可以通过IsReadOnly 属性将DataGrid 设置为只读方式。

    1. 在“Grid示例”的窗口界面中,选择第一行。
      在这里插入图片描述
    2. 对“Grid示例”的窗口界面中,第一行的ProvinceID进行修改,在下拉框中选择“内蒙古自治区”。
      在这里插入图片描述
    3. 在“Grid示例”的窗口界面中,点击“更新”按钮,进行保存。
      在这里插入图片描述
    4. 保存之前的结果。如下图。
      在这里插入图片描述

    转载地址:https://www.cnblogs.com/chillsrc/p/4881724.html
    https://www.cnblogs.com/chillsrc/p/4898061.html
    https://www.cnblogs.com/chillsrc/p/4919626.html

    展开全文
  • WPF 基础视频教程(共50集)---2.XAML基础 2.XAML基础
  • WPF教程(四) Hello,WPF!

    万次阅读 2016-09-21 23:10:10
    在所有编程教程中,第一个例子永远都是经典的“Hello,world!”,在这里我们稍微自恋一下,改成"Hello,WPF!"。本例子简单的将这条文本显示在屏幕上,让你明白开始学习WPF有多么容易。 接下来的教程都默认你已经安装...

    在所有编程教程中,第一个例子永远都是经典的“Hello,world!”,在这里我们稍微自恋一下,改成"Hello,WPF!"。本例子简单的将这条文本显示在屏幕上,让你明白开始学习WPF有多么容易。

    接下来的教程都默认你已经安装了一个IDE,最好是 Visual Studio 或者 Visual Studio Express (参考上一节以获取下载信息)。如果你使用的是其他产品,按照产品说明的指示进行即可。

    下面我们开始在VS下创建应用。首先,在“文件”菜单下选择“新建项目”,这时候左边会出现一个目录树。本教程中的代码都使用C#,所以要在模版列表里选择C#,然后选择Windows,在右边的列表中选择“WPF应用程序”,把它命名为“HelloWPF” 并输入到名称文本框里。确认对话框底部的所有设置都正确,然后点击确认按钮。


    新项目里有很多文件,我们暂时先集中来看“MainWindox.xaml”这个文件。它是应用程序的主窗口,也就是执行应用程序时显示的第一个窗口,当然前提是你没做过更改。XAML代码(XAML会在后面的章节仔细讲解)如下:

    <span style="font-size:14px;"><Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
    
        </Grid>
    </Window></span>
    这是VS为我们的窗口创建的基础XAML,在后面的“XAML和The Window”章节有解释每一个细节。你现在就可以运行这个应用程序啦,选择调试-->开始调试(或者直接按F5)后,你会看到一个空的窗口。现在是时候把我们的文本显示到屏幕上了。我们通过添加一个TextBlock控件到网格上来实现上面提到的信息。

    <span style="font-size:14px;"><Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="72">
                            Hello, WPF!
                    </TextBlock>
        </Grid>
    </Window></span>
    现在让我们来运行一下,选择调试-->开始调试(或者直接按F5),来看看这个漂亮的成果——你的第一个WPF应用:



    我们使用了TextBlock控件中的三个属性,来对齐文本(居中),让字体变大,所有这些概念都会在后面的章节讲到。

    恭喜你走到了这一步,继续学习后面的内容,很快你就能掌控WPF了。

    展开全文
  • Devexpress WPF教程

    2017-08-18 01:21:00
    【视频专辑】酷炫界面开发神器DevExpress WPF视频教程(36集全) http://www.devexpresscn.com/post/620.html 转载于:https://www.cnblogs.com/ifendou/p/7385497.html

    【视频专辑】酷炫界面开发神器DevExpress WPF视频教程(36集全)

    http://www.devexpresscn.com/post/620.html

    转载于:https://www.cnblogs.com/ifendou/p/7385497.html

    展开全文
  • WPF全套视频教程,含:1.wpf入门 2.wpf 3.wpf进阶基础(共9.06GB) 网盘分享 分享给有需要的人 被下载次数多了,积分会自动上涨。如果积分上涨了可给我留言,我修改积分:...
  • WPF入门教程+源码

    2018-06-30 19:30:39
    很好WPF的入门资料,非常适合想学习WPF的新手,而且还有配套的源代码.
  • 介绍了如何使用Visual Studio 2013创建一个WPF应用程序
  • 微软WPF的Blend简单教程,入门的教程,菜鸟同学可以看下
  • 教程分三套完整视频 1.WPF入门视频33集(含课程代码和课堂练习) 2.WPF基础视频50集 3.WPF进阶视频113集 赠送:WPF编程宝典电子书及书籍源代码 学习流程: 1.没有C#基础的首先学习C# 三套基础课程,7天时间 ...
  • WPF中使用转换的简要介绍
  • WPF教程WPF教程WPF教程

    2011-06-23 19:13:32
    WPF教程,网上参考信息,wpf之家:http://www.wpf123.com
  • WPF基础视频教程(第三季)-传智播客 杨中科 WPF基础视频教程(第三季)-传智播客 杨中科
  • WPF教程内容涉及元素的布局、控件模型、控件内容模型、焦点处理、依赖项属性、路由事件、WPF命令、WPF样式与模板、WPF资源、图形的使用、数据的绑定、三维、动画等。内容丰富,有难有易。代码经过我精心调试,都...
  • WPF教程(十五)MVVM框架

    千次阅读 2018-09-26 13:33:54
    学习WPF说白点也是因为其强大的UI,其实我忽视了很重要的一点,直到接触了MVVM框架,其实Web前后端开发已经指明了未来编程趋势,各干各的:完美的前段和强劲的后端,个人是这么认为的。 WPF是微软视其为下一代用户...

    作者本人以前是做C++的,当然很顺利的进入到WinForm,这也让我基本没有View-Model思维。学习WPF说白点也是因为其强大的UI,其实我忽视了很重要的一点,直到接触了MVVM框架,其实Web前后端开发已经指明了未来编程趋势,各干各的:完美的前段和强劲的后端,个人是这么认为的。

    WPF是微软视其为下一代用户界面技术,XAML的使用就是为了降低耦合度。那么我们不得不说说WinForm和WPF的区别了。

           1. WinForm更新UI的操作是通过后台操作UI名,即ID来完成的。WPF是通过数据Binding来实现UI更新的。
           2. WinForm响应用户操作的方式是事件Event。WPF是通过命令(Command)Binding的方式。

    所以说,从你写的第一个WPF的Hello World!开始,你就要转变思路了!而不是很多人做的那种给按钮添加事件,点击触发然后抱怨和过去的Winform没啥区别,一点都不好用。

    我们先看一个简单点的例子,不知道大家是不是一个有心的人,在之前的数据绑定过程中,我发现如果数据变化了呢?前台是否还会自主更新,答案是并不会,现在接触到MVVM,问题迎刃而解。

    public class Name
    {
        string _userName;
        string _companyName;     
        public string UserName
        {
            get { return _userName; }       
            set { _userName = value;}
        }   
        public string CompanyName
        {
            get { return _companyName; }
            set { _companyName = value;}         
        }
    }
    public partial class MainWindow : Window
    {
        Name MyName = new Name();       
        public MainWindow()
        {
            InitializeComponent();
            MyName = base.DataContext as Name;                
        }
        private void Update_Click(object sender, RoutedEventArgs e)
        {
             //界面不会更新
            MyName.UserName = "Rose";
            MyName.CompanyName= "中软易通";
        }
    }
    <Window x:Class="mvvm.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:mvvm"
            Title="MainWindow"  Height="147.806" Width="407.044">
        <Window.DataContext>  
            <local:Name UserName="Pc-Yang" CompanyName="FS" />
        </Window.DataContext>
        <StackPanel VerticalAlignment="Center" Orientation="Horizontal">
            <TextBlock Text="用户名:" Margin="20"/>
            <TextBlock Text="{Binding UserName}" Margin="0,20"/>
            <TextBlock Text="公司名称:" Margin="20"/>
            <TextBlock Text="{Binding CompanyName}" Margin="0,20"/>
            <Button Content="更新" Click="Update_Click" Margin="20"/>
        </StackPanel>
    </Window>

    当我们点击按钮时候,根本没用啥反应,如果这种事情存在WPF中,不可能,否则就是失败。现在我们进行MVVM改造。定义一个NotificationBase类,这个类的作用是实现了INotifyPropertyChanged接口,目的是绑定数据属性。实现了它这个接口,数据属性发生变化后才会去通知UI,否则不会有任何。如果想在数据属性发生变化前知道,需要实现INotifyPropertyChanging接口。

    public class Name : NotificationBase
    {
        string _userName;
        string _companyName;   
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; RaisePropertyChanged("UserName"); }
        }
        /// <summary>
        /// 公司名
        /// </summary>
        public string CompanyName
        {
            get { return _companyName; }          
            set { _companyName = value; RaisePropertyChanged("CompanyName"); }
        }
    }
    public class NotificationBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    整个逻辑不难理解,这里有个知识点就是接口实现事件,我在C#基础教程(三)做下知识点分析。我们也可以用命令来实现上面的MVVM,请看下面代码(这段代码感觉不是很走心,甚至有点累赘,可能MVVM的命令用法不是这样的)。

    <Window x:Class="mvvm.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:mvvm"
        Title="MainWindow"  Height="147.806" Width="407.044">
        <Window.DataContext>  
            <local:Name UserName="Pc-Yang" CompanyName="FS" />
        </Window.DataContext>
        <StackPanel VerticalAlignment="Center" Orientation="Horizontal">
            <TextBlock Text="用户名:" Margin="20"/>
            <TextBlock Text="{Binding UserName}" Margin="0,20"/>
            <TextBlock Text="公司名称:" Margin="20"/>
            <TextBlock Text="{Binding CompanyName}" Margin="0,20"/>
            <Button Command="{Binding PrintCmd}" Name="UpdateBtn" Content="更新" Click="Update_Click" Margin="20"/>
        </StackPanel>
    </Window>
    public class Name : NotificationBase
    {
        string _userName;
        string _companyName;   
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; RaisePropertyChanged("UserName"); }
        }
        /// <summary>
        /// 公司名
        /// </summary>
        public string CompanyName
        {
            get { return _companyName; }
            set { _companyName = value; RaisePropertyChanged("CompanyName"); }
        }
        /// 方法函数
        public void PrintNowName(object obj)
        {
            string[] Arr=obj as string[];
            MainWindow.name.UserName = Arr[0];
            MainWindow.name.CompanyName = Arr[1];
        }
    }
    public class NotificationBase : INotifyPropertyChanged
    {
        //属性改变自动添加方法函数
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    class DelegateCommand : ICommand
    {
        public Action<object> ExecuteCommand = null;
        public Func<object, bool> CanExecuteCommand = null;
        public event EventHandler CanExecuteChanged;
        //不停询问是否可以执行
        public bool CanExecute(object parameter)
        {
            if (CanExecuteCommand != null)
            {
                return this.CanExecuteCommand(parameter);
            }
            else
            {
                return true;
            }
          }
        //执行
        public void Execute(object parameter)
        {
            if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
        }
    }
    class ViewModel
    {
        public DelegateCommand PrintCmd { get; set; }
        public Name name { get; set; }
        public ViewModel()
        {         
            this.name = new Name();        
            this.PrintCmd = new DelegateCommand();
            this.PrintCmd.ExecuteCommand = new Action<object>(this.name.PrintNowName);
        }
    }
    public partial class MainWindow : Window
    {
        static public Name name;
        public MainWindow()
        {
            InitializeComponent();
            //将上下文数据指向对象name
            name = base.DataContext as Name;
        }
        private void Update_Click(object sender, RoutedEventArgs e)
        {
            //命令是否传递参数,即CanExecute的parameter
            this.UpdateBtn.CommandParameter = new string[] { "jack", "鱼骨头" };
            this.UpdateBtn.DataContext = new ViewModel();
        }
    }

    总结

    上下文数据DataContext对于属性Binding来说极为重要,关系能不能找到绑定属性。

    DataContext是继承于顶层框架类的一个字段。

    这里探讨的MVVM极为浅显,属于入门级,但为DataGrid等其它控件如何动态绑定,打下基础。

    曾经因为项目接触到DevExpress控件,可以用其MVVM组件。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,737
精华内容 3,894
关键字:

wpf教程