c# wpf如何附加依赖项属性

作者:杜文龙 时间:2023-01-09 05:05:56 

附加依赖项属性是一个属性本来不属于对象自己,但是某些特定场景其他的对象要使用该对象在这种场景下的值。这个值只在这个场景下使用。基于这个需求设计出来的属性。这里主要涉及到一个解耦问题。最大的优势是在特定场景下使用的属性,可以在特定场景下定义。这样业务上不会导致代码全部混在某个模块里。提升代码可维护性。

我们举例一段代码。假设有个类Person。包含了身份ID(IdentityID),姓名(Name),出生年月(Birth date),性别(gender),民族(Nation)。 有一个School类,包含了年级(grade)。我们把用户所在的年纪通过依赖项属性的形式从Person类中解耦出去。这样就可以更好的设计业务的关联关系。

我们创建继承自DependencyObject的School类。使用propa 快捷方式创建属性。我们给School添加了一个附加依赖项属性GradeProperty。

c# wpf如何附加依赖项属性

代码如下:


public class School : DependencyObject
{
 public static int GetGrade(DependencyObject obj)
 {
  return (int)obj.GetValue(GradeProperty);
 }

public static void SetGrade(DependencyObject obj, int value)
 {
  obj.SetValue(GradeProperty, value);
 }

// Using a DependencyProperty as the backing store for Grade. This enables animation, styling, binding, etc...
 public static readonly DependencyProperty GradeProperty =
  DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new PropertyMetadata(0));
}

我们继续创建Person类,使用propdp创建。因为我们已经学习了依赖项属性,所以我们只使用依赖项属性来创建所有Person下的属性对象。


public class Person : DependencyObject
{
 public string IdentityID
 {
  get { return (string)GetValue(IdentityIDProperty); }
  set { SetValue(IdentityIDProperty, value); }
 }

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

public string Name
 {
  get { return (string)GetValue(NamePropertyProperty); }
  set { SetValue(NamePropertyProperty, value); }
 }

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

public DateTime BirthDate
 {
  get { return (DateTime)GetValue(BirthDateProperty); }
  set { SetValue(BirthDateProperty, value); }
 }

// Using a DependencyProperty as the backing store for BirthDate. This enables animation, styling, binding, etc...
 public static readonly DependencyProperty BirthDateProperty =
  DependencyProperty.Register("BirthDate", typeof(DateTime), typeof(Person));

public bool Gender
 {
  get { return (bool)GetValue(GenderProperty); }
  set { SetValue(GenderProperty, value); }
 }

// Using a DependencyProperty as the backing store for Gender. This enables animation, styling, binding, etc...
 public static readonly DependencyProperty GenderProperty =
  DependencyProperty.Register("Gender", typeof(bool), typeof(Person));

public string Nation
 {
  get { return (string)GetValue(NationProperty); }
  set { SetValue(NationProperty, value); }
 }

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

}

我们创建一个按钮来给Person设置一个附加依赖项属性。学校的年级。

xaml代码和对应的cs代码:


<Button Content="点击给Pserson对象在对应的业务上附加依赖性属性" Click="AddPsersonAttachedProperty_Click"/>

private void AddPsersonAttachedProperty_Click(object sender, RoutedEventArgs e)
 {
  Person person = new Person();
  School.SetGrade(person, 1);
  var grade = School.GetGrade(person);
  MessageBox.Show(grade.ToString()) ;
 }

我门通过点击按钮创建了一个Person对象。使用School.SetGrade(person,1)来调用了我门添加在School类下面的附加依赖项属性。我门给Person设置了附加依赖项属性,是School下的Grade依赖项属性值为1。关键点:附加依赖项属性的适用场景是给当前对象添加在某些场景下使用的属性值。  这个时候我们可以使用School.GetGrade(person)读取这个对象中的依赖项属性。依赖项属性理解到这里就行。Grid和子元素在Grid中放置行列的原理和这个对依赖项属性使用是一样的。只是有一些后续的逻辑。目前只要会使用能看懂就好。后续会在自定义控件中,设计自己的布局呈现控件时,在设计阶段讲解哪些应该使用依赖项属性,哪些使用附加依赖项属性。

用一个通过附加属性移动Slider控制小球在Canvas下的例子。 给一个不存在Left 和top属性的小球。添加一个在父容器canvas的附加依赖属性,用来控制小球在Canvas下的位置。附加依赖项属性,主要用于解耦。这篇文章就结束拉。


<Canvas>
   <Slider x:Name="sliderX" Canvas.Top="10" Canvas.Left="10" Width="200" Minimum="50" Maximum="200"/>
   <Slider x:Name="sliderY" Canvas.Top="40" Canvas.Left="10" Width="200" Minimum="50" Maximum="200"/>
   <Ellipse Fill="Blue" Width="30" Height="30" Canvas.Left="{Binding ElementName=sliderX,Path=Value}" Canvas.Top="{Binding ElementName=sliderY,Path=Value}"/>
  </Canvas>

我们使用Canvas作为画板,在里面放入2个Slider一个控制水平位置,一个控制垂直位置。我们通过绑定Slider的Value到Ellipse在Canvas下的附加依赖项属性Canvas.Left和Canvas.Top来

控制小球的垂直和水平位置。来演示如何解耦Ellipse和canvas的布局关系。通过前面了解的的binding、依赖项属性和附加依赖项属性,发现写代码的思路是不是一下就改变了很多?耦合正在慢慢的从设计层就变低了。

来源:https://www.cnblogs.com/duwenlong/archive/2021/03/25/14573470.html

标签:c#,wpf,附加,依赖项属性
0
投稿

猜你喜欢

  • 详解Java的MyBatis框架和Spring框架的整合运用

    2022-09-19 19:22:20
  • Java中ArrayList和SubList的坑面试题

    2023-09-21 06:56:21
  • java实现快速排序图文详解

    2022-10-11 16:35:18
  • 详解JAVA动态代理

    2023-11-24 22:52:04
  • Java自动生成趋势比对数据的方法分享

    2023-11-25 18:29:18
  • 基于Springboot实现JWT认证的示例代码

    2023-04-01 09:46:40
  • 腾讯开源消息中间件TubeMQ总体介绍分析

    2022-06-21 05:10:03
  • Android刮刮卡功能具体实现代码

    2021-08-06 04:12:24
  • Android studio 3.0安装配置方法图文教程

    2021-05-26 14:48:42
  • C#发送Get、Post请求(带参数)

    2023-04-11 07:28:14
  • Android中3种全屏方法及3种去掉标题栏的方法

    2023-11-07 18:45:51
  • springboot使用自定义注解实现aop切面日志

    2023-11-11 09:14:48
  • SpringBoot外部化配置使用Plus版的方法示例

    2022-12-21 01:03:46
  • Android webView字体突然变小的原因及解决

    2022-01-02 23:39:08
  • java isInterrupted()判断线程的实例讲解

    2023-07-21 01:45:53
  • Android7.0 MTK设置默认桌面

    2023-09-26 12:30:43
  • Spring依赖注入的三种方式小结

    2022-08-09 15:56:41
  • Java中的ArrayList容量及扩容方式

    2023-10-17 17:24:40
  • Java桶排序之基数排序详解

    2021-08-26 13:38:58
  • Java为什么基本数据类型不需要进行创建对象?

    2022-03-16 08:59:03
  • asp之家 软件编程 m.aspxhome.com