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)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用 ...
随机推荐
- UINavigationController技巧<一>——修改返回按钮的标题
UINavigationController 一般push到另一界面后,返回按钮标题便是上一页面的title,但是对于push的第一页或者是上一页面没有title的,返回按钮标题便是默认back,如图 ...
- JS onkeydown控制HTML Input 只录入浮点数值
// -1) return false; return index == 0 } keychar = String.fromCharCode(keynum) var newVal = oriVal.s ...
- JS学习笔记(四)常用对象
Error // 语法 throw new Error("消息"); 类似于C#中的Exception对象 // alert(num); try { throw new Error ...
- AngularJS 实战讲义笔记
第一部分 快速上手 1.1 感受AngularJs四大核心特性(MVC, 模块化,指令系统,双向数据绑定)1.2 搭建自动化的前端开发,调试,测试环境 代码编辑工具 (sublime) 断点调试工具 ...
- iOS程序启动原理(简单)
1.执行main -> 执行UIApplicationMain UIApplicationMain底层实现 1.创建UIApplication对象 2.创建UIApplication代理对象 3 ...
- Openlayers 自定义控件
OpenLayers.Control.YourControl = OpenLayers.Class(OpenLayers.Control, { // may private properties he ...
- spring与hibernate整合事务管理的理解
在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...
- JVM学习之强引用、弱引用、软引用、虚引用
转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...
- Invalid signature file digest for Manifest main attributes
Solving a Spark error: Invalid signature file digest for Manifest main attributes When using spark-s ...
- js 删除本身节点元素
var theParent = document.getElementById("bq_ly"); theParent.parentNode.removeChild(thePa ...