2011-07-31 84 views
0

我按照這個職位的說明:how to create Multiple user control that pointing single code behind file in silverlight 4如何將功能添加到繼承的屬性?

這是我的代碼示例。

public class MyCommonUserControl : UserControl 
{ 
    public static DependencyProperty CustomProperty = DependencyProperty.Register(
     "CustomProperty", typeof(int), typeof(MyCommonUserControl)); 

    public int CustomProperty 
    { 
     get 
     { 
      return (int)GetValue(TypeProperty); 
     } 
     set 
     { 
      SetValue(TypeProperty, value); 
      Extension(); 
     } 
    } 

    public virtual void Extension() 
    { 
    } 
} 

public class FirstMyCommonUserControl : MyCommonUserControl 
{ 
    public FirstMyCommonUserControl() 
    { 
     InitializeComponent(); 
    } 

    public override void Extension() 
    { 
     base.Extension(); 

     // Do something 
    } 
} 

正如你在上面看到的,我使用了繼承。此代碼適用於我,因爲我有幾個自定義控件,其中一個是重寫虛擬方法的FirstMyCommonUserControl類,我可以爲此特定類添加一些內容。然後我這麼做:

MyCommonUserControl A; 
    int number; 

    private void button1_Click(object sender, RoutedEventArgs e) 
    {    
     switch (number) 
     { 
      case 1: 
      case 2: 
      case 3: 
      case 4: 
       A = new FirstMyCommonUserControl(); 
       A.CustomProperty = number; 

       canvas1.Children.Add((FirstMyCommonUserControl)A); 
       break; 
      case 5: 
      case 6: 
      case 7: 
      case 8: 
       A = new AnotherMyCommonUserControl(); 
       A.CustomProperty = number; 

       canvas1.Children.Add((AnotherMyCommonUserControl)A); 
       break; 
     } 
    } 

每個特定的類都需要在CustomProperty中做更多的事情。我使用虛擬方法創建它並覆蓋它。我不知道這是否是最好的方法。

+1

如果你正在做的是,當一個依賴執行額外的動作屬性設置(或更改),您應該只註冊屬性的值更改處理程序。不需要明確地使其變成「虛擬」或改變基本行爲。 –

+0

確實。實際上,對於依賴項屬性,您甚至不應**在CLR包裝器中執行任何操作,請參閱[本頁](http://msdn.microsoft.com/zh-cn/library/bb613563.aspx)爲什麼是這種情況。 –

回答

1

屬性也可以是虛擬的,不僅是方法。所以,你可以寫類似

public class MyCommonUserControl : UserControl 
{  
    public virtual int CustomProperty  
    {   
     get { return (int)GetValue(TypeProperty); } 
     set { SetValue(TypeProperty, value); } 
    } 
} 

public class FirstMyCommonUserControl : MyCommonUserControl 
{ 
    public override int CustomProperty  
    {   
     get 
     { 
      // Do something 
      return base.CustomProperty; 
     } 
     set 
     { 
      // Do something 
      base.CustomProperty = value; 
     } 
    } 
} 

雖然是否是這個更好是值得商榷的。

此外,還有在此表達你的不需要鑄造:

canvas1.Children.Add((FirstMyCommonUserControl)A); 

你可以這樣寫:

canvas1.Children.Add(A); 
+0

謝謝!鮑里斯做了詭計,感謝幫助。只有兩個問題,你怎麼知道沒有必要演員?是否有可能改變override屬性中的數據類型? –

+0

@ oscar.fimbres:#1 - 由於Add方法接受的繼承鏈比MyCommonUserControl低得多,所以不需要進行強制轉換。 #2您不能更改虛擬財產的返回類型。你*可以*聲明它返回一個'對象',但在這種情況下,你應該重新考慮你的設計:)。另外,我的解決方案通常是解決您的問題,但對於您的特定需求(DependancyProperty),您可以查看Jeff Mercado和H.B.在對你的問題發表評論時建議。 –