WPF利用依赖属性和命令编写自定义控件
以实例讲解(大部分讲解在代码中)
1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试,
<UserControl x:Class="SelfControlDenpendy.SelfControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<StackPanel Width="200" Height="250" Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBox Width="180" Height="50" x:Name="id" Margin="5"></TextBox>
<TextBox Width="180" Height="50" Text="{Binding ElementName=id,Path=Text}" Margin="5"></TextBox>
<Button Height="26" Width="120" x:Name="show" Margin="5" Content="测试绑定控件自身命令"
Command="{Binding ChangedIndexCommand}"
CommandParameter="{Binding ElementName=id,Path=Text}"></Button>
<Button Height="26" Width="120" x:Name="buttonout" Margin="5"
Command="{Binding ButtonCommend, Mode=TwoWay}" Content="测试绑定外部命令" ></Button>
</StackPanel>
</Grid>
</UserControl>
2,打开用户控件后台代码编写依赖属性以及命令(需要引入GalaSoft.MvvmLight.dll)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Navigation;
using System.Windows.Shapes; namespace SelfControlDenpendy
{
/// <summary>
/// SelfControl.xaml 的交互逻辑
/// </summary>
public partial class SelfControl : UserControl
{
public SelfControl()
{
InitializeComponent();
DataContext = this;//注意此处用于绑定的源必须写,也可把所有依赖代码写在ViewModel里面
ChangedIndexCommand= new RelayCommand<string>(AutoPaging);//注意带参数的命令的写法
}
void AutoPaging(string s)//命令执行带参数的方法
{
MessageBox.Show(s);
}
static SelfControl()//依赖属性的赋值必须写在静态函数里面因为是依赖属性静态只读在家上此处需要在初始化时就注册依赖属性古写在此处
{ //也可不写在此处而写在字段定义出对其直接赋值
UIPropertyMetadata md = new UIPropertyMetadata("", PropertyInputNameChanged);//第一个参数代表默认值(注意类型)
SelfControl.InputNameProperty = DependencyProperty.Register("InputName", typeof(string), typeof(SelfControl), md);//最后一个参数用于当依赖属性值改变是调用md指定的方法
ChangedCommandProperty =//内部访问命令
DependencyProperty.Register("ChangedCommand", typeof(ICommand), typeof(SelfControl), new PropertyMetadata(null));//不许要默认值时写null或不要最后一个参数
ButtonCommendProperty =//外部绑定命令
DependencyProperty.Register("ButtonCommend", typeof(ICommand), typeof(SelfControl), new PropertyMetadata(null));
} public ICommand ButtonCommend
{
get { return (ICommand)GetValue(ButtonCommendProperty); }
set { SetValue(ButtonCommendProperty, value); }
}
public ICommand ChangedCommand
{
get { return (ICommand)GetValue(ChangedCommandProperty); }
set { SetValue(ChangedCommandProperty, value); }
}
public static readonly DependencyProperty ChangedCommandProperty;//可以不用敲代码只用输入propdp按Tab即可完成编写
public static readonly DependencyProperty InputNameProperty;
public static readonly DependencyProperty ButtonCommendProperty;
public string InputName
{
get { return (string)GetValue(SelfControl.InputNameProperty); }
set { SetValue(SelfControl.InputNameProperty, value); }
} private static void PropertyInputNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)//此方法非常重要可用于编写逻辑代码
{ SelfControl sc = (SelfControl)d; string str = (string)e.NewValue;//外部赋给依赖属性的值(注意依赖属性的类型) if (str != "" && str != null)
{
sc.id.Text = str.ToString();
}
}
}
}
}
3,在主窗口中就可以使用此用户控件(注意引入命名空间)
<Window x:Class="Dependency.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loac="clr-namespace:Dependency"
Title="MainWindow" Height="350" Width="600">
<Grid>
<TextBox x:Name="tt" Margin="428,70,32,208"></TextBox>
<loac:SelfControl x:Name="sc" Margin="10,10,189,60" RenderTransformOrigin="0.456,0.7"
ButtonCommend="{Binding AutoCommand}"></loac:SelfControl>
<Button x:Name="bt" Margin="225,283,49,0" Content="测试依赖属性" Click="bt_Click"></Button>
</Grid>
</Window>
4,后台逻辑代码
using GalaSoft.MvvmLight.Command;
using System.Windows;
using System.Windows.Input; namespace Dependency
{
public partial class MainWindow : Window
{ public MainWindow()
{
InitializeComponent();
DataContext = this;
AutoCommand = new RelayCommand(showcommend);//不带参数的命令
AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);//添加判断的命令
bt.Command = AutoCommand;//赋值命令,用于关联命令
sc.ButtonCommend = AutoCommand;//关联依赖命令
}
void showcommend()
{
MessageBox.Show("测试");
}
public ICommand AutoCommand { get; private set; }
private ICommand m_ButtonCommand;//此处并未使用此命令,只是显示一般命令的写法
public ICommand ButtonCommand
{
get
{
return m_ButtonCommand;
}
set
{
m_ButtonCommand = value;
}
}
public ICommand AddUserCommand { get; private set; }
void ExecuteAddUser()
{
//逻辑代码
}
bool CanExecuteAddUser()
{
//逻辑代码
return true;
}
private void bt_Click(object sender, RoutedEventArgs e)
{
sc.InputName = tt.Text.ToString();
AutoCommand.Execute(null);//执行定义的命令可代替bt.Command = AutoCommand;
}
}
}
1,若出现在XAML使用用户控件依赖命令时出现“未识别或无法访问”的提示时重新编译或生成一下即可
2,有可能出现把自定义命令赋值给用户控件的命令但是出现没有调用执行方法,此时建议改用绑定关联,或检查用户控件中使用命令的位置是否合适
3,依赖属性的默认值类型错误,注意修改依赖属性注册处的最后一个参数
WPF利用依赖属性和命令编写自定义控件的更多相关文章
- WPF 使用依赖属性自定义控件
使用依赖属性自定义控件,依赖属性必须定义在自定义控件中,不能定义在其他文件中 一.先实现一个类继承你要复写的类 using System; using System.Collections.Gener ...
- WPF的依赖属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...
- 利用windows系统ftp命令编写的BAT文件上传[转]
利用windows系统ftp命令编写的BAT文件上传[转] 利用windows系统ftp命令编写的BAT文件上传[转] 在开发中往往需要将本地的程序上传到服务器,而且用惯了linux命令的人来说.在w ...
- wpf 的依赖属性只能在loaded 事件之后才能取到
wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 ...
- WPF 中依赖属性的继承(Inherits)
WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- WPF的依赖属性和附加属性(用法解释较全)
转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...
- WPF: 只读依赖属性的介绍与实践
在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性" ...
- 说说WPF的依赖属性
首先,我们先来大概了解一下依赖属性 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用 ...
随机推荐
- EF 6.0使用小计
---恢复内容开始--- 最近尝试了下EF Extended,但是居然需要EF6.0以上,没办法,只能安装了,打开解决方案,选择库程序包管理下的程序包管理控制台(或者直接右击你需要使用扩展的解决方案选 ...
- SqlServer之存储过程
存储过程最主要的特色:是当写完一个存储过程后即被翻译成可执行码存储在系统表 内,当作是数据库的对象之一,一般用户只要执行存储过程,并且提供存储过程所需的参数就可以得到所要的结果而不必再去编辑 T-SQ ...
- linux下不重启加硬盘
linux下热加载磁盘 临时给虚拟机加了一块硬盘,增加后懒得重启,于是看了看热加载 [root@centos5 ~]# cat /proc/scsi/scsi Attached devices: Ho ...
- 第9课_2_dbsoft安装
三 安装Oracle Database 数据库软件 1.上传数据库安装包到虚拟机上,unzip命令解压database软件,赋予正确的权限和属主,在以oracle身份登录进行图形界面安装 unzip ...
- postgreSQL远程连接出现:Error connecting to server :致命错误 SSL关闭的pg_hba.conf记录
异常截图:
- 20151120 jsp相关
jsp 声明表示.代码片段及引用 <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...
- 如何正确理解正则表达式中的分隔符 \b
前言:好久不见,博客园. 最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [\b] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ...
- Android存储小结
转自:http://www.liaohuqiu.net/cn/posts/storage-in-android/ android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的 ...
- 如何将js与HTML完全脱离
先举出一个例子: var sound='Roar!'; function myOrneryBeast(){ alert(this); this.style.color='green';//this指代 ...
- Werkzeug源码阅读笔记(四)
今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...