WPF模板数据绑定及事件模板绑定

        变更通知是WPF的一个精髓,它使得MVVM成为WPF的标准架构!在数据绑定中,除了正常的数据模版绑定,还会涉及到模板内控件的事件绑定,以及对parent内容的绑定!接下来的示例将会展示大部分常用的绑定场景。

      示例实现的是一个便签软件,主要功能有新增、删除、修改、切换日期、读取便签列表、设置是否完成。

      下面先说下几种绑定方式:

       继承于ICommand和INotifyPropertyChanged的事件委托和通知变更类这里就不写了,网上很多的!或者你可以直接使用mvvmlight的框架。

       在App.xaml中加入资源NoteViewModel,方便在blend中绑定


    
        
    

打开blend,如果不习惯用blend,可以参考后面的xaml代码自己编写!

1、模板数据绑定,这是最基础的绑定,通过blend可以实现

1.1 绑定window的datacontext

WPF模板数据绑定及事件模板绑定_第1张图片

1.2绑定listbox的itemsource

WPF模板数据绑定及事件模板绑定_第2张图片

1.3、右键Listbox > 编辑其他模版 > 编辑生成的项 > 创建新项,拖入一个checkbox和textblock,并绑定相对应的字段。如果需要字段转换,最常用的是bool和visible等,可以自己写convert转换器,具体写法自行百度。

WPF模板数据绑定及事件模板绑定_第3张图片

WPF模板数据绑定及事件模板绑定_第4张图片

1.4 通过“行为”来控制,文本框是否可编辑!原本是只读模式,在双击后可以进行编辑,只展示一个示例,其他的在代码中找!

WPF模板数据绑定及事件模板绑定_第5张图片

2、模版父控件的绑定

下面需要绑定checkbox的点击事件来设置该项任务是否完成。在blend中可以看到,在模板的数据绑定中只能显示notemodel中的字段,这是因为item的datacontext类型为NoteModel。我们想绑定NoteViewModel中的CompleteCommand事件,就需要自行指定绑定的数据源。这需要通过代码实现:



这里的Binding使用到了Path和RelativeSource。

msdn的RelativeSource:http://msdn.microsoft.com/zh-cn/library/system.windows.data.binding.source(v=vs.90).aspx

RelativeSource成员:http://msdn.microsoft.com/zh-SG/library/system.windows.data.relativesource_members(v=vs.85)

RelativeSource的AncestorType:http://msdn.microsoft.com/zh-SG/library/system.windows.data.relativesource.ancestortype(v=vs.85)

这几篇文章读完就能掌握常用的几种绑定方式了。

3、模板绑定某一元素的属性(通过RelativeSource查找)

 
            
        
AncestorLevel来确定向上查找的级别,AncestorType确定要查找的元素!这点很类似于JQuery的Selector。

以上就是几种常用的绑定方式。

下面贴上部分源码:

NoteWindow.xaml


    
        
        
            
        
        
        
            
                
                    
                    
                
                

                
                
                    
                        
                            
                        
                        
                            
                            
                        
                    
                
            
        
        
        
            
            
            
        
        
    
    
        
            
                
            
        
        
            
                
                    
                    
                
            
            
                
                
            
            
            
                
                    
                        
                    
                
            
            
            
            
            
        
    


NoteViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ManageNote.Model;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;

namespace ManageNote.ViewModel
{
    public class NoteViewModel : NotificationObject
    {
        DateTime currentDate;

        private DelegateCommand completeCommand;

        /// 
        /// 设置完成状态事件
        /// 
        public DelegateCommand CompleteCommand
        {
            get
            {
                if (this.completeCommand == null)
                {
                    this.completeCommand = new DelegateCommand(this.SetComplete);
                }

                return this.completeCommand;
            }
        }

        private DelegateCommand delPlan;

        /// 
        /// 删除计划事件
        /// 
        public DelegateCommand DelPlan
        {
            get
            {
                if (this.delPlan == null)
                {
                    this.delPlan = new DelegateCommand(this.Delete);
                }

                return this.delPlan;
            }
        }

        private DelegateCommand changeDateCommand;

        /// 
        /// 修改日期事件
        /// 
        public DelegateCommand ChangeDateCommand
        {
            get
            {
                if (this.changeDateCommand == null)
                {
                    this.changeDateCommand = new DelegateCommand(this.ChangeDate);
                }

                return this.changeDateCommand;
            }
        }

        private DelegateCommand updateTaskCommand;

        /// 
        /// 修改事件
        /// 
        public DelegateCommand UpdateTaskCommand
        {
            get
            {
                if (this.updateTaskCommand == null)
                {
                    this.updateTaskCommand = new DelegateCommand(this.UpdateAgenda);
                }

                return this.updateTaskCommand;
            }
        }

        public NoteViewModel()
        {
            this.BindDate(DateTime.Now.Date);
        }

        private string title;

        /// 
        /// 标题
        /// 
        public string Title
        {
            get
            {
                return this.title;
            }

            set
            {
                if (this.title != value)
                {
                    this.title = value;
                    this.RaisePropertyChanged("Title");
                }
            }
        }

        private ObservableCollection tasks = null;

        /// 
        /// 任务计划集合
        /// 
        public ObservableCollection Tasks
        {
            get
            {
                return this.tasks;
            }

            set
            {
                if (this.tasks != value)
                {
                    this.tasks = value;
                    this.RaisePropertyChanged("Tasks");
                }
            }
        }

        /// 
        /// 设置完成状态
        /// 
        /// 
        /// 
        private void SetComplete(NoteModel iModel)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("UPDATE m_agenda SET IsComplete=");
            strSql.Append(iModel.IsCompleted ? "1" : "0");
            strSql.Append(" WHERE Id=");
            strSql.Append(iModel.Id);
            EJiang.Common.DirectDbHelperMysql.ExecuteSql(strSql.ToString());
        }

        private void ChangeDate(object days)
        {
            this.BindDate(this.currentDate.AddDays(Convert.ToInt32(days)));
        }

        /// 
        /// 用于外部调用,刷新信息
        /// 
        public void RefrushInfo()
        {
            this.Tasks = this.GetNoteByDate(SystemConfig.userId, this.currentDate);
        }

        /// 
        /// 绑定信息
        /// 
        /// 
        private void BindDate(DateTime date)
        {
            this.currentDate = date;
            this.Title = this.currentDate.ToString("yyyy年MM月dd");
            this.Tasks = this.GetNoteByDate(SystemConfig.userId, this.currentDate);
        }

        /// 
        /// 删除
        /// 
        /// 
        private void Delete(NoteModel model)
        {
            if (MessageBox.Show("确定要删除该条任务?", "删除确认", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                string strSql = "DELETE FROM m_agenda WHERE Id=" + model.Id;
                if (EJiang.Common.DirectDbHelperMysql.ExecuteSql(strSql) > 0)
                {
                    this.Tasks.Remove(model);
                }
            }
        }

        /// 
        /// 获取日程
        /// 
        /// 
        /// 
        /// 
        public ObservableCollection GetNoteByDate(int userId, DateTime date)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("SELECT ");
            strSql.Append("Id, ");
            strSql.Append("AgendaContent, ");
            strSql.Append("StartDate, ");
            strSql.Append("IsComplete ");
            strSql.Append("FROM m_agenda ");
            strSql.Append("WHERE StartDate = @startDate ");
            strSql.Append("AND UserId = @userId ");
            MySqlParameter[] para = 
            { 
                new MySqlParameter("@userId", userId),
                new MySqlParameter("@startDate", date)
            };

            ObservableCollection models = new ObservableCollection();
            DataTable dt = EJiang.Common.DirectDbHelperMysql.Query(strSql.ToString(), para).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                models.Add(new NoteModel
                {
                    Id = Convert.ToInt32(dr["Id"]),
                    Content = dr["AgendaContent"].ToString(),
                    IsCompleted = dr["IsComplete"].ToString() == "1" ? true : false,
                    StartDate = Convert.ToDateTime(dr["StartDate"])
                });
            }

            return models;
        }

        /// 
        /// 新增日程
        /// 
        /// 
        public void AddAgenda()
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("INSERT INTO m_agenda  ");
            strSql.Append("(UserId,");
            strSql.Append("AgendaContent,  ");
            strSql.Append("StartDate,  ");
            strSql.Append("LimitDate) ");
            strSql.Append("VALUES ");
            strSql.Append("(@UserId,  ");
            strSql.Append("@AgendaContent,  ");
            strSql.Append("@StartDate,  ");
            strSql.Append("@LimitDate)");
            MySqlParameter[] para = 
            { 
                new MySqlParameter("@UserId", SystemConfig.userId),
                new MySqlParameter("@AgendaContent", "请输入您的任务!"),
                new MySqlParameter("@StartDate", this.currentDate),
                new MySqlParameter("@LimitDate",  this.currentDate)
            };

            int id = Convert.ToInt32(EJiang.Common.DirectDbHelperMysql.ExecuteInsert(strSql.ToString(), para));
            if (id > 0)
            {
                this.Tasks.Add(new NoteModel
                {
                    Id = id,
                    Content = "请输入您的任务!",
                    IsCompleted = false,
                    StartDate = this.currentDate
                });
            }
        }

        /// 
        /// 更新日程
        /// 
        /// 
        private void UpdateAgenda(NoteModel noteModel)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("UPDATE m_agenda   ");
            strSql.Append("SET  ");
            strSql.Append("AgendaContent = @AgendaContent    ");
            strSql.Append("WHERE  ");
            strSql.Append("Id = @Id  ");
            MySqlParameter[] para = 
            { 
                new MySqlParameter("@Id", noteModel.Id),
                new MySqlParameter("@AgendaContent", noteModel.Content)
            };

            EJiang.Common.DirectDbHelperMysql.ExecuteSql(strSql.ToString(), para);
        }
    }
}
 
  
源码地址: http://download.csdn.net/detail/wuwo333/6316627


你可能感兴趣的:(WPF)