WPF 依赖属性与依赖对象
1 /// <summary> 2 /// MainWindow.xaml 的交互逻辑 3 /// </summary> 4 public partial class MainWindow : Window 5 { 6 public MainWindow() 7 { 8 InitializeComponent(); 9 } 10 11 private void btnClick_Click(object sender, RoutedEventArgs e) 12 { 13 MyDependencyObject myDp = new MyDependencyObject(); 14 myDp.SetValue(MyDependencyObject.FlagProperty, this.txt1.Text); 15 txt2.Text = (string)myDp.GetValue(MyDependencyObject.FlagProperty); 16 } 17 } 18 19 public class MyDependencyObject:DependencyObject 20 { 21 public static readonly DependencyProperty FlagProperty = 22 DependencyProperty.Register("Flag", typeof(string), typeof(MyDependencyObject)); 23 24 }
View Code从上面的例子中,我们可以知道依赖对象作为依赖属性的宿主,才能形成完整的binding目标被数据所驱动。
其中DependencyObject是WPF相当底层的一个基类,所有的UI控件都是继承与它。它又是继承与DispatchObject.
也就是说,所有的UI控件,在WPF中,属性都是依赖属性。
另外从上面的例子中可以看出来,主要由三个部分构成:
1)注册依赖属性(还有其他重载方法):
DependencyProperty.Register(string name, Type propertyType, Type ownerType)
第一个参数是注册的属性的名称(这个名称跟将来要包装的CLR属性的名称一样),第二个参数是这个属性的返回类型,第三个是这个属性的寄托类的类型。
这里要注意,这个依赖属性的对象名称一般都比注册的名称多一个Property,这是一种潜规则,虽然也可以为其他的值。
另外注册的依赖属性对象都是public static readonly。
2)依赖对象的SetValue方法。
第一个参数是注册的依赖属性的对象名称(带Property后缀的),第二个是要设置的依赖属性的值。
3)依赖对象的GetValue方法。
参数就是注册的依赖属性的对象名称(带Property后缀的)。
说到这里,我们暂时先搁下不谈,我们先看看一个一般的UI控件的属性是什么样子的:
比如Textbox.Text属性,这个是个CLR属性,那么其跟依赖属性是什么关系了,原来在Text属性的内部,也是调用了SetValue, GetValue方法,
并且还执行了类型转换(string类型),这样就相当于用这个包装器以实例属性的形式向外界暴露依赖属性,这样一个依赖属性才能成为数据源的path,
我们再看看Textbox设定绑定的方法,其有一个SetBinding的方法,其实就是在内部调用的BindingOperations.SetBinding的方法,这也看出了微软希望能够
设置绑定的对象时UI对象。我们自己在构造依赖对象的时候,也可以构造一个SetBinding的方法,以方便调用。
如果直接使用BindingOperations:
MyDependencyObject myDpo = new MyDependencyObject();
private void DirectlyBinding()
{
BindingOperations.SetBinding(myDpo, MyDependencyObject.FlagProperty, new Binding("Text") { Source = txt1 });
BindingOperations.SetBinding(txt2, TextBox.TextProperty , new Binding("Flag") { Source = myDpo });
}
注意第一句SetBinding是把txt1的Text CLR属性绑定到myDpo这个依赖对象的FlagProperty依赖属性上。
第二句SetBinding是把myDpo的Flag CLR属性绑定到txt2这个依赖对象的TextProperty依赖属性上。
特别是第二个参数千万不要搞错了,是第一个参数中的依赖属性。
另外这个myDpo对象不能放到局部变量里面,否则是达不到效果的。
另外还有一点,如果我事先在txt2中输入了字符,在txt1中输入字符是不会更新到txt2中的,不知道为什么?
从以上我们可以看出,CLR属性其实就是依赖属性的代言人,,有没有这个代言人,依赖属性都是存在的。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70577.html