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)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用 ...
随机推荐
- UITabBarController 笔记(二) ViewController中加UITabBarController
新建一个简单视图iOS工程,在ViewController的viewDidLoad中代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...
- openstack之horizon源码分析
一.基础准备: Horizon是基于django webframework开发的标准的Python wsgi程序,django的设计专注于代码的高度可重用,信奉DRY原则,一切面向对象,而Horizo ...
- bounds 和 frame
使用环境: 一个UIView 添加xib View 时需要注意使用 frame and bounds 代码: frame 和 bounds 对比 样式对比 其实说白了就是 frame: 该view在父 ...
- ListBox第一行字体比其他行小
ListBox第一行字体比其他行小,把字体设置成“宋体”就可以了.
- jquery ajax 参数可以序列化
<form> <input type="text" name="FirstName" value="Bill" /> ...
- Struts 2.x 与Spring4.x整合出现:No mapping found for dependency [type=java.lang.String, name='actionPackages...
Struts2.16与Spring4.x整合出错: Caused by: java.lang.RuntimeException: com.opensymphony.xwork2.inject.Depe ...
- vsftpd限制用户不能更改根目录
在IE下登陆会出现如下图所示情况,当时直接吓尿了,尼玛这台危险了.仔细一想可定是在配置vsftpd.conf时没有设置用户不能更改根目录:
- Schema-based AOP support
本文参考至:spring-framework-reference.pdf的7.3 章节 [Schema-based AOP support] If you are unable to use Java ...
- JS 精粹( 函数)
函数是对象,它与其它对象唯一的不同是它可以调用.函数可实现:代码复用.信息隐藏.代码组合调用. 建立函数时会建立:上下文.调用函数的代码.每个函数(除Function.prototype)都会有一个原 ...
- JSP基础——关于中文乱码问题
乱码问题十分烦人,今天在写一个登陆的demo时,表单中需要提交的中文姓名,如下代码 <form action="success.jsp" name="success ...