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;  }
      }

  }
相关推荐
周杰伦fans2 小时前
WPF TextBlock 中 Run 元素实战——从密码强度检测到 MVVM 绑定
wpf
largecode20 小时前
座机号码认证如何操作?申请热线实名名片,树立统一官方客服形象
linux·sql·华为·c#·.net·wpf·harmonyos
小满Autumn1 天前
WPF 入门:XAML 语法、布局与数据绑定
microsoft·c#·.net·wpf
小满Autumn1 天前
WPF 进阶:样式、触发器与控件模板
c#·.net·wpf
她说彩礼65万2 天前
WPF视觉树 逻辑树
wpf
贺国亚2 天前
分布式并发
分布式·wpf
Iawfy_2 天前
WPF的ComboBox绑定Enum枚举
wpf
她说彩礼65万2 天前
WPF TemplateBinding
wpf
她说彩礼65万2 天前
WPF 三大模板类型 四大属性名称
wpf
无心水2 天前
金融系统数据一致性之战:联机交易与批量作业的冲突处理完全指南
人工智能·金融·wpf·批量作业·顶尖架构师·联机交易·金融架构师