被询问的多了,所以写个记录下(下次就可以直接扔链接了)。先给示例代码
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代码
探究为什么
{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属性添加绑定
运行后很简单看出 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 是直接绑定到控件的依赖属性上的。
PS:使用模板的话,建议直接使用定义自定义控件。



