C # WPF пользовательский элемент управления не отвечает на свойства XAML во время разработки? - PullRequest
2 голосов
/ 25 марта 2009

Я создал UserControl, который по сути является кнопкой. На нем есть изображение и метка, и я создал два свойства для установки источника изображения и текста метки следующим образом:

        public ImageSource Icon
    {
        get { return (ImageSource)this.GetValue(IconProperty); }
        set { this.SetValue(IconProperty, value); icon.Source = value; }
    }
    public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NavigationButton));

    public string Text
    {
        get { return (string)this.GetValue(TextProperty); }
        set { this.SetValue(TextProperty, value); label.Content = value; }
    }

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(NavigationButton));

Однако, когда я добавил элемент управления на свою страницу, элементы управления не будут реагировать на любые свойства, заданные в XAML, например <controls:MusicButton Icon="/SuCo;component/Resources/settings.png/> ничего не делает.

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 25 марта 2009

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;
}
0 голосов
/ 25 марта 2009

Вы также пытались установить свойство text? Источник изображения может быть просто неверным. Текст намного проще.

Кроме того, в вашем примере вы пропустили кавычку. Так что, если он скопирован из вашего реального кода, вы можете проверить это.

Если исключить эти незначительные, по общему признанию маловероятные причины вашей проблемы, я бы предложил установить свойства в коде, чтобы проверить, оказывает ли это какое-либо влияние. Если да, то вам стоит проверить свой XAML.

Поскольку вы не опубликовали оставшуюся часть кода, я не могу точно сказать, есть ли у вас проблемы в другом месте, которые могут повлиять на элемент управления.

И да, я знаю, что я не очень полезен, но я работаю с WPF совсем недавно. Надеюсь, это поможет в любом случае.

...