// 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代码

探究为什么

{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:使用模板的话,建议直接使用定义自定义控件。

前言被询问的多了,所以写个记录下(下次就可以直接扔链接了)。先给示例代码 public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } // Using a DependencyProperty as the backing stor Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。 以下案例,为了图方便,我以之前的博客的基础为模板,直接进行开发。如有遇到疑问的地方,可以查看先前的博客(W...
<UserControl x:Class="DXApplication1.Control.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2...
一、首先添加一个简单自定义控件UserTestControl; xaml代码如下,将背景色绑定依赖属性: <UserControl x:Class="WpfApp1.UserTestControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/win
依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知道.NET的属性只不过是get/set方法的语法糖衣。 "Dependency properties are the workhorse of WPF. This infrastructure provides f...
WPF实例系列一:登录、注册界面设计 文章目录WPF实例系列一:登录、注册界面设计前言一、实例演示1. 登录界面展示2. 注册界面展示3. 数据存储4. 效果演示二、结构及源码1.主界面跳转登录界面设计2.登录界面设计3.注册界面设计4.Excel保存数据类设计5.源码 本实例将展示利用WPF设计登录界面、注册界面,并实现相应的功能,其中账户数据将存储在excel表中。 一、实例演示 1. 登录界面展示 2. 注册界面展示 3. 数据存储 4. 效果演示 二、结构及源码 "用户控件"继承自UserControl,而UserControl继承自ContentControl,也就是内容控件 UserControl和Window是一个层次上的,都有xaml和cs文件 创建用户控件 写好用户控件 <UserControl x:Class="WpfDemo.UserControlDemo.OwnUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presenta
Binding 是前台UI(显示层)和后台代码(数据层)的桥梁。理论上当后台的数据变动时,显示的数据或样式应该随之而变。这些是动态的。 对于Binding的设置可以在前台Xaml,也可以在后台Code里面定义,但是既然Xaml可以做很多事情,那么所有对UI的操作我们都可以交给它。 其实,WPF的本身是一种数据驱动UI的设计模式,使用了MVVM(Model-View-ViewModel)的模式...
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控件,以创建出更具可重用性和可维护性的应用程序。