当前位置:首页 > Windows程序 > 正文

WPF 依赖属性与依赖对象

2021-05-24 Windows程序

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