以实例讲解(大部分讲解在代码中)


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利用依赖属性和命令编写自定义控件的更多相关文章

  1. WPF 使用依赖属性自定义控件

    使用依赖属性自定义控件,依赖属性必须定义在自定义控件中,不能定义在其他文件中 一.先实现一个类继承你要复写的类 using System; using System.Collections.Gener ...

  2. WPF的依赖属性

    Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...

  3. 利用windows系统ftp命令编写的BAT文件上传[转]

    利用windows系统ftp命令编写的BAT文件上传[转] 利用windows系统ftp命令编写的BAT文件上传[转] 在开发中往往需要将本地的程序上传到服务器,而且用惯了linux命令的人来说.在w ...

  4. wpf 的依赖属性只能在loaded 事件之后才能取到

    wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  ...

  5. WPF 中依赖属性的继承(Inherits)

    WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...

  6. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  7. WPF的依赖属性和附加属性(用法解释较全)

    转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...

  8. WPF: 只读依赖属性的介绍与实践

    在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性" ...

  9. 说说WPF的依赖属性

    首先,我们先来大概了解一下依赖属性 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用 ...

随机推荐

  1. 我使用过的Linux命令之date - 显示、修改系统日期时间

    原文地址:http://www.cnblogs.com/diyunpeng/archive/2011/11/20/2256538.html 用途说明 ate命令可以用来显示和修改系统日期时间,注意不是 ...

  2. 图片缩放JavaScript原生实现

    function scalImg(aLi){ for(var i=0,l=aLi.length;i<l;i++){ var oImg = new Image(), oLi = aLi[i], i ...

  3. 调magento自定义模板发邮件

    1. 设置邮件模板 <global> <template> <email> <custom_email_template1 module="Samp ...

  4. C# in Depth阅读笔记2:C#2特性

    1.方法组转换 c#2支持一个从方法组到兼容委托类型的隐式转换,即如: button.click+=new eventhandler(logevent)可以写成 button.click+=logev ...

  5. winform CheckedListBox实现全选/全不选

    /全选         private void button3_Click(object sender, EventArgs e)         {             for (int i ...

  6. javascript高级知识点——实例类型

    代码信息来自于http://ejohn.org/apps/learn/. 分析一下对象的结构 function Ninja(){} var ninja = new Ninja(); console.l ...

  7. 自学Xpath的几个例子

    Xpath可以对XML文件中的信息进行查找,并对XML文件树形结构进行遍历.详细语法请转:http://www.w3school.com.cn/xpath/index.asp 例子:利用在JavaSc ...

  8. UTL_FILE 的用法

    UTL_FILE 的用法   UTL_FILE 是用来进行文件IO处理的专用包,使用这外包的注意事项如下: 1. 生成的文件好象只能放置在DATABASE所在的服务器路径中. 2. 生成的文件如何DO ...

  9. Neo4j简介

    Neo4j简介 发表于2013年3月16日 11:52 p.m.    位于分类图数据库与图并行计算 现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS ...

  10. Eclipse 浏览文件插件- OpenExplorer

    http://blog.csdn.net/w709854369/article/details/6599167 EasyExplorer  是一个类似于 Windows Explorer的Eclips ...