CLR свойства, которые обертывают свойства зависимостей, должны никогда не иметь никакой логики, кроме вызова GetValue
и SetValue
. Это потому, что они могут даже не называться. Например, компилятор XAML оптимизирует, вызывая GetValue
/ SetValue
напрямую, а не используя ваше свойство CLR.
Если вам нужно выполнить некоторую логику при изменении свойства зависимости, используйте метаданные:
public ImageSource Icon
{
get { return (ImageSource)this.GetValue(IconProperty); }
set { this.SetValue(IconProperty, value); }
}
public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton), new FrameworkPropertyMetadata(OnIconChanged));
private static void OnIconChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
//do whatever you want here - the first parameter is your DependencyObject
}
EDIT
В моем первом ответе я предположил, что XAML вашего элемента управления (будь то из шаблона или непосредственно в UserControl) правильно подключен к свойствам. Вы не показали нам этот XAML, так что, возможно, это было неверное предположение. Я ожидаю увидеть что-то вроде:
<StackPanel>
<Image Source="{Binding Icon}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
И, что важно, ваш DataContext должен быть настроен на сам элемент управления. Вы можете сделать это различными способами, но вот очень простой пример установки из кода:
public YourControl()
{
InitializeComponent();
//bindings without an explicit source will look at their DataContext, which is this control
DataContext = this;
}