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


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. Expect:100-Continue & HTTP 417 Expectation[转]

    Expect:100-Continue & HTTP 417 Expectation 背景:今天调试火车票查询的代码,发现一个奇怪的事情,如果使用公司本地的代理,那么一切正常,如果使用的是公司 ...

  2. ORACLE 如何查询被锁定表及如何解锁释放session

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 --锁表查询SQLSELECT ...

  3. js的this几种用法

    1.普通的函数调用 此时指的是全局对象 function aaa(){ this.x=1;}aaa();alert(x) 2.对象内的方法this调用 此时指的是上一级对象 var aaa={ zz: ...

  4. 教你如何利用初级C#语言更改银行存款!!!!

    您是否对生活现状不满意? 您是否总是感叹工资太少? 您是否经常发现自己相中的物品又降价了然而自己却还是只能望洋兴叹? 没关系!让我来拯救你的钱包! 接下来进入正题: 要想更改自己的银行存款首先得找到一 ...

  5. Java数组复制

    System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制.其函数原型是: public static void arraycopy(Object src, int sr ...

  6. python 文件夹比较

    参考:http://blog.csdn.net/imzoer/article/details/8675078 文件比较:filecmp模块:filecmp '''Created on 2014-6-6 ...

  7. Python你必须知道的十个库

    Python是优雅的,使用这些库可以使你的代码更简洁,并保持持久性.欢迎各位补充,并提出意见! Docopt.抛弃optparse和argparse吧,使用docstrings来构建优雅的,可读性强的 ...

  8. 编写一个程序实现strcmp函数的功能

    写自己的strcat函数------→mycmp #include <stdio.h> #include <string.h> #define N 5 int mycmp(ch ...

  9. 理解TCP为什么需要进行三次握手

        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: ...

  10. javascript学习笔记(2)

    <html> <head><title>Throwing die</title><script>    var canv_width  = ...