在C#WPF属性网格中,在运行时使用decorator模式定义属性网格定义是否有效?

在C#WPF属性网格中,在运行时使用decorator模式定义属性网格定义是否有效?,c#,wpf,decorator,propertygrid,xceed,C#,Wpf,Decorator,Propertygrid,Xceed,您可以使用decorator模式为C#WPF MVVM项目中的属性网格定义属性吗?所以我想在属性网格中实现一个特定的功能,特别是使属性能够处理对其属性网格的更改,并在运行时生成更多属性作为响应 那么,如果有人从属性网格中的下拉列表中选择了一个特定的选项,根据所选的选项,它会在其下方生成不同的属性?使用装饰器模式来定义属性网格不同视图的排列是否有效?或者是否有更好的模式或方法来处理此类功能?当您考虑激活其他属性行时,这个想法听起来很不错。处理程序只需将当前的PropertyGrid实例替换为封装原

您可以使用decorator模式为C#WPF MVVM项目中的属性网格定义属性吗?所以我想在属性网格中实现一个特定的功能,特别是使属性能够处理对其属性网格的更改,并在运行时生成更多属性作为响应


那么,如果有人从属性网格中的下拉列表中选择了一个特定的选项,根据所选的选项,它会在其下方生成不同的属性?使用装饰器模式来定义属性网格不同视图的排列是否有效?或者是否有更好的模式或方法来处理此类功能?

当您考虑激活其他属性行时,这个想法听起来很不错。处理程序只需将当前的
PropertyGrid
实例替换为封装原始实例的say
AdditionalSelection1PropGrid
的新实例

但是,如果要停用其他属性,会发生什么情况?是否要遍历decorator链并删除应停用的decorator?我想这可能会有点难看。为了做到这一点,你将不得不使装饰可用的外部装饰。这种类型打破了装饰器模式,因为装饰实例将不会具有与装饰器相同的接口

解决方法是为扩展属性列表的每个decorator创建一个反向decorator。如果存在其他属性,反向装饰器只会删除这些属性。反向修饰符在代码中非常优雅地解决了这个问题,但也有一些缺点:

  • 它使decorator的数量加倍,因为对于每个添加特定属性的decorator,必须有一个正好删除这些属性的反向
  • 当用户大量激活/停用属性和/或UI的使用寿命较长时,这可能会导致很长的装饰器链。如果它们变得很长,可能会导致性能问题。您应该注意每个装饰器都有最小的内存占用

当您考虑激活其他属性行时,这个想法听起来相当不错。处理程序只需将当前的
PropertyGrid
实例替换为封装原始实例的say
AdditionalSelection1PropGrid
的新实例

但是,如果要停用其他属性,会发生什么情况?是否要遍历decorator链并删除应停用的decorator?我想这可能会有点难看。为了做到这一点,你将不得不使装饰可用的外部装饰。这种类型打破了装饰器模式,因为装饰实例将不会具有与装饰器相同的接口

解决方法是为扩展属性列表的每个decorator创建一个反向decorator。如果存在其他属性,反向装饰器只会删除这些属性。反向修饰符在代码中非常优雅地解决了这个问题,但也有一些缺点:

  • 它使decorator的数量加倍,因为对于每个添加特定属性的decorator,必须有一个正好删除这些属性的反向
  • 当用户大量激活/停用属性和/或UI的使用寿命较长时,这可能会导致很长的装饰器链。如果它们变得很长,可能会导致性能问题。您应该注意每个装饰器都有最小的内存占用

是的,没错,我没有想到。。。使用工厂模式创建要发送到PropertyGrid.selectedobject和数据上下文的对象怎么样?那会更干净吗?\@user3290306,我用一个建议更新了我的答案。你能检查一下在你的场景中这听起来是否合理吗?是的,是的,我没有想到。。。使用工厂模式创建要发送到PropertyGrid.selectedobject和数据上下文的对象怎么样?那会更干净吗?\@user3290306,我用一个建议更新了我的答案。你能检查一下在你的场景中这听起来是否合理吗?