WPF 用户控件UserControl 依赖属性绑定

前言

被询问的多了,所以写个记录下(下次就可以直接扔链接了)。先给示例代码

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

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(UserControl1));




Xaml代码
<UserControl x:Class="WpfApp3.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:WpfApp3"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" x:Name="uc">
    <StackPanel>
        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=local:UserControl1},Path=Text}"></TextBlock>
        <TextBlock Text="{Binding ElementName=uc,Path=Text}"></TextBlock>
        <!--错误的绑定方式-->
        <!--<TextBlock Text="{Binding Text}"></TextBlock>-->
    </StackPanel>
</UserControl>

探究为什么

{Binding} 这个到底绑定到了什么
 

1.先给窗体设置一下DataContext,很简单的设置了一个对象。
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new Student() { Name = "Body",Sex = "Male",Age = 18};
        }

    }

    public class Student { 
        public string Name { get; set; }

        public string Sex { get; set; }

        public int Age { get; set; }
    }
2.在Xaml添加一个Lable,给Content属性添加绑定
    <StackPanel>
        <Label x:Name="LableInstance" Content="{Binding}" ></Label>
    </StackPanel>

运行后很简单看出 Content绑定结果是自身的DataContext(为什么不是父级的,可以自己单独给Label设置一个和父级不一样DataContext,我就不演示了)。而且它的DataContext继承了父级的DataContext。StackPanel的DataContext自然而然也是这个。

源码里面也定义了DataConetxt依赖属性,由子元素继承FrameworkPropertyMetadataOptions.Inherits
DataContextProperty = DependencyProperty.Register("DataContext", typeof(object), _typeofThis, new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, OnDataContextChanged));

我们不难发现用户控件的DataContext是继承于父级的。用户控件里面的元素也是继承用户控件的DataContext,所以是没办法用简单的Binding Path 来绑定到依赖属性的。

如果不喜欢写那么一大串的绑定,可以用模板来。用TemplateBinding 是直接绑定到控件的依赖属性上的。

<UserControl x:Class="WpfApp3.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:WpfApp3"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="local:UserControl1">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:UserControl1">
                        <TextBlock Text="{TemplateBinding Text}"></TextBlock>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
</UserControl>

PS:使用模板的话,建议直接使用定义自定义控件。

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一个用于构建Windows应用程序的框架,而UserControlWPF中的一种自定义控件UserControl允许我们将多个现有的WPF控件组合在一起,形成一个新的、可重用的控件。通过创建自定义的UserControl,我们可以将一组相关的控件封装成一个单一的控件,以增强应用程序的可维护性和重用性。 创建自定义的UserControl通常有以下几个步骤: 1. 创建一个新的WPF用户控件项目,并定义UserControl的外观和布局。这可以通过在XAML文件中使用已有的WPF控件、布局容器和样式来完成。 2. 在UserControl的代码后台(Code-behind)文件中,可以定义一些附加的属性和方法,以增强UserControl的可定制性和功能。 3. 在UserControl中可以定义一些依赖属性(Dependency Properties),以允许开发者在使用UserControl时进行数据绑定属性设置。 4. 在需要使用自定义UserControl的地方,可以将其直接添加到XAML中,并进行相关的属性设置和事件处理。 自定义的UserControl可以在整个应用程序中重复使用,从而提高了开发效率。通过UserControl的封装,我们可以将一组相关的功能和样式打包到单个控件中,简化了应用程序的UI设计和代码开发过程。 总而言之,WPF的自定义控件UserControl为开发者提供了一种简单且高效的方式来自定义和组合现有的WPF控件,以创建出更具可重用性和可维护性的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值