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

  }
相关推荐
c#上位机20 小时前
wpf之MVVM中只读属性更新界面
c#·wpf·mvvm
就是有点傻20 小时前
WPF自定义控件之环形进度条
wpf
He BianGu20 小时前
【笔记】WPF中如何的动态设置DataGridTextColumn是否显示
笔记·wpf
Pota-to成长日记1 天前
Redisson 看门狗机制深度解析:分布式锁的守护者
分布式·wpf
为java加瓦1 天前
分布式单例模式在微服务架构中的关键作用与实践
wpf
c#上位机1 天前
wpf之Ellipse控件
wpf
c#上位机1 天前
wpf之GroupBox
c#·wpf
分布式存储与RustFS1 天前
告别手动配置:用 Terraform 定义你的 RustFS 存储帝国
云原生·wpf·文件系统·terraform·对象存储·minio·rustfs
c#上位机2 天前
wpf之TabControl
c#·wpf