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