2013-02-11 2 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

Вы не можете использовать сеттер, так как XAML не вызывает его напрямую: он просто вызывает SetValue (DependencyProperty, значение), не проходя через ваш сеттер. Вы должны обрабатывать 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

1

Свойство обертка для DependencyProperty просто шаблонный, что никогда не должны делать ничего, кроме GetValue и SetValue делать. Причиной этого является то, что что-либо, устанавливающее значение вне прямых вызовов оболочки свойств из кода, не использует оболочку и напрямую вызывает GetValue и SetValue. Сюда входят XAML и Bindings. Вместо установщика обертки вы можете добавить обратный вызов PropertyChanged в метаданные в декларации DP и выполнять дополнительную работу там. Это вызвано для любого вызова SetValue.

+0

спасибо за объяснения. – Taras

Смежные вопросы