WPF用户控件和依赖属性

依赖属性

**定义:**自己没有值,由别人给他赋值

应用场景

  • 要求属性支持绑定(只有依赖属性可以绑定)
  • 自定义控件/扩展控件属性
  • 验证/强制回调
  • 继承
  • 附加属性(一种特殊的依赖属性)

创建依赖属性

快捷键propdp+tab(两次)

可以看到下面代码,创建依赖属性分为三步:定义,注册和包装

cs 复制代码
//包装
public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
//定义和注册
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

上面代码中Register里面参数内容

属性名称就是页面中控件属性名称,要和属性名称相同

所有者类型是这个属性所在的类的类型

属性元数据是初始属性数据

使用依赖属性来绑定用户控件内部控件属性

当我们将label和textbox作为一个用户控件使用时,要想对label的content属性或者textbox的text进行赋值,无法直接进行。

userControl.xaml文件

在这里面做绑定,绑定自己定义在cs文件里面的依赖属性,绑定方式也要注意不能使用普通的绑定方式,​依赖属性 ​ 是控件的"内置属性",需通过 ElementName来进行绑定,绑定源是控件而非默认的 DataContext

XML 复制代码
<UserControl x:Class="WPF_try.UserControl1"
             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" 
             xmlns:local="clr-namespace:WPF_try"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
               x:Name="root">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Label x:Name="label" Content="{Binding LabelText, ElementName=root}"/>
            <TextBox x:Name="textBox" Width="200" Text="{Binding Text, ElementName=root, Mode=TwoWay}"/>
        </StackPanel>
    </Grid>
</UserControl>

userControl.cs文件

依赖属性,作为整个用户控件对外的设置接口

cs 复制代码
 public partial class UserControl1 : UserControl
 {
     public UserControl1()
     {
         InitializeComponent();
    
     }
     // 标签文本属性
     public static readonly DependencyProperty LabelTextProperty =
         DependencyProperty.Register(
             "LabelText",
             typeof(string),
             typeof(UserControl1),
             new PropertyMetadata("Default Label"));

     // 文本框内容属性
     public static readonly DependencyProperty TextProperty =
         DependencyProperty.Register(
             "Text",
             typeof(string),
             typeof(UserControl1),
             new FrameworkPropertyMetadata(
                 default(string),
                 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

     public string LabelText
     {
         get { return (string)GetValue(LabelTextProperty); }
         set { SetValue(LabelTextProperty, value); }
     }

     public string Text
     {
         get { return (string)GetValue(TextProperty); }
         set { SetValue(TextProperty, value); }
     }
 }

mainwindow.xaml文件

将依赖属性和cs文件中的属性进行绑定指定他的初始值,或者使用赋值方式给与值

XML 复制代码
<StackPanel>
    <local:UserControl1 LabelText="用户名" Text="{Binding UserName}"/>
    <local:UserControl1 LabelText="密码" Text="{Binding Password}"/>
</StackPanel>

mainwindow.cs文件

cs 复制代码
  public partial class MainWindow : Window
  {
      public MainWindow()
      {
          DataContext = this;
          InitializeComponent();
        
      }
      private string _userName="sdad";
      public string UserName
      {
          get { return _userName; }
          set { _userName = value;  }
      }

      private string _password="123456";
      public string Password
      {
          get { return _password; }
          set { _password = value;  }
      }

  }
相关推荐
yanaiding2 天前
C# WPF 独立开发看图工具 PixSight 经验介绍(二)—— 水印模块开发实录
图像处理·c#·wpf·个人开发
我是苏苏4 天前
WPF开发01:基础控件及常用模板篇
开发语言·c#·html·wpf
dalong105 天前
WPF:3D顶点共享与法线设置对光照效果的影响
3d·wpf
柔蘭5 天前
WPF中的CommunityToolkit.Mvvm框架
wpf
aGdF8E3gQ6 天前
【Application Insights】采样率对Function App日志收集的影响和解决方法
python·flask·wpf
程序员-Benothing6 天前
如何实现高并发系统订单30分钟自动关闭?
开发语言·c#·wpf
一水7 天前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
dalong107 天前
WPF:3D甜甜圈
3d·c#·wpf·甜甜圈
别催小唐敲代码7 天前
ROS2从入门到实战:去中心化机器人操作系统详解
wpf·ros2
脚踏实地皮皮晨8 天前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio