2013-02-11 107 views
0

我想創建一個自定義的圖像控件,因爲我必須根據某些事件來操作它的源代碼,我也會有相當大數量的這種控件。爲此,我決定將我的類(「nfImage」)從Image繼承,並且我希望有一個DP(實際上會反映這些事件),以便將其綁定到視圖模型。我在做:將依賴項屬性添加到從控件繼承的類?

class nfImage : Image 
{ 
    public static readonly DependencyProperty TagValueProperty = 
     DependencyProperty.Register("TagValue", typeof(int), typeof(nfImage), new UIPropertyMetadata(0)); 

    public int TagValue 
    { 
     get { return (int)GetValue(TagValueProperty); } 
     set 
     { 
      SetValue(TagValueProperty, value); 
      if (this.Source != null) 
      { 
       string uri = (this.Source.ToString()).Substring(0, (this.Source.ToString()).Length - 5) + value.ToString() + ".gif"; 
       ImageBehavior.SetAnimatedSource(this, new BitmapImage(new Uri(uri, UriKind.Absolute))); 
      } 
     } 
    } 
} 

問題是它不起作用。如果我從後面的代碼中設置TagValue的值,則會更改源代碼,但是如果從xaml(通過dp)設置它,則不會發生任何事情,綁定也不起作用。我如何實現這一目標?

回答

1

你不能使用setter,因爲XAML不直接調用它:它只是調用SetValue(DependencyProperty,value)而不通過setter。您需要處理PropertyChanged事件:

class nfImage : Image 
{ 

    public static readonly DependencyProperty TagValueProperty = 
     DependencyProperty.Register("TagValue", typeof(int), typeof(nfImage), new UIPropertyMetadata(0, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     var _this = dependencyObject as nfImage; 
     var newValue = dependencyPropertyChangedEventArgs.NewValue; 
     if (_this.Source != null) 
     { 
      string uri = (_this.Source.ToString()).Substring(0, (_this.Source.ToString()).Length - 5) + newValue.ToString() + ".gif"; 
      //ImageBehavior.SetAnimatedSource(this, new BitmapImage(new Uri(uri, UriKind.Absolute))); 
     } 
    } 

    public int TagValue 
    { 
     get { return (int)GetValue(TagValueProperty); } 
     set { SetValue(TagValueProperty, value); } 
    } 
} 
+0

briliant!非常感謝!! – Taras 2013-02-11 22:26:14

1

的包裝屬性一個DependencyProperty僅僅是樣板應該永遠不會做任何事情,但和的GetValue的SetValue。原因是任何設置直接調用代碼中屬性包裝的值之外的值都不使用包裝器,而是直接調用GetValue和SetValue。這包括XAML和綁定。您可以添加一個PropertyChanged回調到您的DP聲明中的元數據中,並在那裏做額外的工作,而不是包裝設置器。這被稱爲任何SetValue調用。

+0

謝謝你的解釋。 – Taras 2013-02-11 22:27:20

相關問題