我正在使用一个库,它需要我的视图来实现一个接口,它只是一个依赖属性,并为它获取\ set访问器。唯一的区别是DP寄存器方法中的OwnerType。 AFAIK,重复代码很糟糕,我忘记在粘贴几次后改变OwnerType :)所以我想我应该尝试将其移动到基类中,并让它确定类型。经过一些搞乱之后,我通过在构造函数中初始化它,使用GetType()来确定类型。唯一的问题是当视图被破坏时,以后会重新创建,这会导致DP已经注册的ArgumentException。
@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; }
}
找到解决方案:
我将Register OwnerType更改为typeof(MyViewBase),并将作业放回到字段中。
答案 0 :(得分:1)
这对我来说听起来像是一个很好的重构,尽管在每个类中都有一个简单的方法,而在超类中有一个稍微复杂的方法。
我不明白为什么在执行重构时行为发生了变化。无论什么机制在其实例被销毁时取消注册一个类应该继续工作;如果没有,那么探究原因。
是什么取消注册机制?你可以在调试器中单步执行它,直接实现接口的类吗?在你的重构下,图书馆可能会出现一些反思;如果是这样,最简单的事情可能是将错误报告给库作者并恢复到重复代码方法,直到它被修复。关于在粘贴后忘记更改OwnerType,也许你可以从一个片段中粘贴它,其中所有者类型被注释掉,或者为空或者不可编译,以迫使你快速修复它。