2010-09-18 64 views
0

我正在使用一个库,它需要我的视图来实现一个接口,它只是一个依赖项属性并为它设置\ set访问器。唯一的区别是DP的Register方法中的OwnerType。 AFAIK,重复代码是不好的,我忘记了现在粘贴几次后更改OwnerType :)所以我想我应该尝试将它移到基类中,并确定它的类型。经过一番混乱之后,我通过在构造函数中初始化它,使用GetType()来确定类型,从而得到它的工作。唯一的问题是视图被破坏,并在稍后重新创建,这会导致DP已经注册的ArgumentException。将接口实现拉入基类

  1. 这是重构一个好主意吗?
  2. 我在做对吧? :)
  3. 如果1和2是真的,我该如何检查DP是否已经注册?

@Carl: 我不确定依赖项属性是否曾经被注销过。我甚至不知道,如果依赖属性可以注销:)

这里是原来的班级,一个XAML视图的代码隐藏(这和它的基类是我的作品):

[ViewnameToViewLookupKeyMetadata("StartView", typeof (StartView))] 
public partial class StartView : IWorkSpaceAware 
{ 
    public EditorStartView() 
    { 
     InitializeComponent(); 
    } 


    public static readonly DependencyProperty WorkSpaceContextualDataProperty = 
     DependencyProperty.Register("WorkSpaceContextualData", typeof(object), typeof(StartView), 
            new FrameworkPropertyMetadata((WorkspaceData)null)); 

    public WorkspaceData WorkSpaceContextualData 
    { 
     get { return (WorkspaceData) GetValue(WorkSpaceContextualDataProperty); } 
     set { SetValue(WorkSpaceContextualDataProperty, value); } 
    } 
} 

元数据属性只是将查找字符串与类型相关联。

我认为这是有效的,因为只有在第一次创建视图时,寄存器才会执行一次。

在基类中,Register似乎必须位于构造函数中,所以我可以使用GetType()作为OwnerType。所以,当再次创建视图时,它会尝试再次注册,导致ArgumentException。

界面简单:

public interface IWorkSpaceAware 
{ 
    WorkspaceData WorkSpaceContextualData { get; set; } 
} 

找到解决方案:

我改变了注册OwnerType到typeof运算(MyViewBase),并把分配后列。

回答

1

对我来说这听起来像是一个很好的重构,尽管在每个类中都有一个简单的方法,而在超类中有一个稍微复杂的方法。

我不明白为什么当你执行重构时行为改变了。不管什么机制最初在其实例被销毁时取消注册,都应该继续工作;如果没有,那么探索为什么不。

什么的取消注册机制?你可以在调试器中完成它,直接实现接口的类吗?在你的重构下,图书馆可能会有一些反思失败;如果是这样,最简单的事情可能是向库作者报告错误,并恢复到重复代码方法,直到它被修复。关于在粘贴之后忘记更改OwnerType,也许您可​​以将其从OwnerType注释掉或空白或以其他方式不可编译的片段中粘贴,以强制您快速修复它。