2010-10-22 73 views
2

我在SL中設置了自定義控件,並試圖讓控件的默認外觀正常工作。我覺得(在這裏一些聰明人的幫助下),我正在接近這一點,但我還沒有完成。Silverlight自定義控件中的依賴項屬性的默認值

當我的控件第一次被添加到Blend中的面板時,它顯示爲我期望基於該模板,當我修改我公開的依賴項屬性時,這些工作也很好。我現在遇到的問題是,當通過Blend進行更改,然後使用選項框「重置」該值時,它會重置「雜項」窗格下的屬性,但除非在設計視圖中實際更改控件本身,除非我再次構建項目。

這是我目前擁有的代碼:我已經試過與屬性修修補補改變回調但都沒有成功得到它的工作

public enum SolidGlossTypes 
    { 
     Normal, 
     Header, 
     Footer, 
     None 
    } 

    public SolidGlossTypes SolidGlossType 
    { 
     get 
     { 
      return (SolidGlossTypes)GetValue(SolidGlossTypeProperty); 
     } 
     set 
     { 
      SetValue(SolidGlossTypeProperty, value); 
      switch (value) 
      { 
       case SolidGlossTypes.Header: 
        SolidGloss_Upper.Visibility = Visibility.Visible; 
        SolidGloss_Lower.Visibility = Visibility.Collapsed; 
        break; 
       case SolidGlossTypes.Footer: 
        SolidGloss_Upper.Visibility = Visibility.Collapsed; 
        SolidGloss_Lower.Visibility = Visibility.Visible; 
        break; 
       case SolidGlossTypes.None: 
        SolidGloss_Upper.Visibility = Visibility.Collapsed; 
        SolidGloss_Lower.Visibility = Visibility.Collapsed; 
        break; 
       default: 
        SolidGloss_Upper.Visibility = Visibility.Visible; 
        SolidGloss_Lower.Visibility = Visibility.Visible; 
        break; 
      } 
     } 
    } 

    public static readonly DependencyProperty SolidGlossTypeProperty = DependencyProperty.Register("SolidGlossType", typeof(SolidGlossTypes), typeof(SolidGloss), new PropertyMetadata(SolidGlossTypes.Normal)); 

另外,是否可以將依賴項屬性的默認值設置爲generic.xaml中的樣式,然後綁定到模板中的樣式?

由於提前,

Ë

回答

2

問題是您放置額外的代碼在你的二傳手。當使用依賴屬性時,設置器並不總是被調用,例如當其他一些外部代碼調用傳入SolidGlossTypeProperty和一個新值時,不會調用setter。

您應該使用屬性回調方法來執行其他操作。

編輯

例如: -

public SolidGlossTypes SolidGlossType 
{ 
    get 
    { 
     return (SolidGlossTypes)GetValue(SolidGlossTypeProperty); 
    } 
    set 
    { 
     SetValue(SolidGlossTypeProperty, value); 
    } 
} 

public static readonly DependencyProperty SolidGlossTypeProperty = DependencyProperty.Register(
    "SolidGlossType", 
    typeof(SolidGlossTypes), 
    typeof(SolidGloss), 
    new PropertyMetadata(SolidGlossTypes.Normal, OnSolidGlossTypePropertyChanged)); 


private static void OnSolidGlossTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
     SolidGloss source = d as SolidGloss; 
     SolidGlossTypes value = (SolidGlossTypes)e.NewValue 

     switch (value) 
     { 
      case SolidGlossTypes.Header: 
       source.SolidGloss_Upper.Visibility = Visibility.Visible; 
       source.SolidGloss_Lower.Visibility = Visibility.Collapsed; 
       break; 
      case SolidGlossTypes.Footer: 
       source.SolidGloss_Upper.Visibility = Visibility.Collapsed; 
       source.SolidGloss_Lower.Visibility = Visibility.Visible; 
       break; 
      case SolidGlossTypes.None: 
       source.SolidGloss_Upper.Visibility = Visibility.Collapsed; 
       source.SolidGloss_Lower.Visibility = Visibility.Collapsed; 
       break; 
      default: 
       source.SolidGloss_Upper.Visibility = Visibility.Visible; 
       source.SolidGloss_Lower.Visibility = Visibility.Visible; 
       break; 
     } 
} 

在這種安排每當SolidGlossTypeProperty值由任何手段(在你的代碼的setter改變,通過動畫或其他直接調用SetValue)將始終調用回調屬性更改方法。

+0

+1,你也許想考慮讓enum成爲第一類對象,並把相關的值放在那裏,而不是在你的set方法中 – 2010-10-22 16:40:23

+0

好吧,我失去了如何使用屬性回調方法不知道要在switch語句中放置什麼,而不是'value' – Eric 2010-10-22 16:52:19

+0

Alex:我不明白你的意思 – Eric 2010-10-22 16:53:04

相關問題