2010-09-18 67 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註釋掉或空白或以其他方式不可編譯的片段中粘貼,以強制您快速修復它。