【发布时间】:2010-09-18 12:47:23
【问题描述】:
我正在使用一个库,它需要我的视图来实现一个接口,该接口只是一个依赖属性和它的 get\set 访问器。唯一的区别是 DP 的 Register 方法中的 OwnerType。 AFAIK,重复代码很糟糕,我现在粘贴几次后忘记更改 OwnerType :) 所以我想我应该尝试将它移到基类中,并让它确定类型。经过一番折腾,我通过在构造函数中初始化它,使用 GetType() 来确定类型,让它开始工作。唯一的问题是当视图被销毁并在稍后重新创建时,这会导致 DP 已注册的 ArgumentException。
- 这种重构是个好主意吗?
- 我做得对吗? :)
- 如果 1 和 2 为真,如何检查 DP 是否已注册?
@卡尔: 我不确定依赖属性是否曾经被取消注册。我什至不确定依赖属性是否可以取消注册:)
这是原始类,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; }
}
找到解决方案:
我将 Register OwnerType 更改为 typeof(MyViewBase),并将分配放回字段中。
【问题讨论】:
标签: c# refactoring interface