我正在使用一個庫,它需要我的視圖來實現一個接口,它只是一個依賴項屬性併爲它設置\ 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),並把分配後列。