Обновление объекта с привязанным к данным свойством - PullRequest
1 голос
/ 10 августа 2011

Я думаю, что мне здесь не хватает чего-то очень фундаментального.

Я создал UserControl с DependencyProperty, определенным так:

    public static DependencyProperty SpinnerColourProperty = DependencyProperty.Register("SpinnerColour", typeof(Color), typeof(LoadingControl), new PropertyMetadata(Colors.Black));

    public Color SpinnerColour
    {
        get
        {
            return (Color)GetValue(SpinnerColourProperty);
        }
        set
        {
            SetColour(value);
            SetValue(SpinnerColourProperty, value);
        }
    }

(Да, я предпочитаю британско-английский ... так что подайте в суд на меня: P)

Метод SetColour, как и ожидалось, меняет внешний вид элемента управления.

Если в моем коде я напишу customControl1.SpinnerColour = Colors.Red, тогда элемент управления правильно изменит цвет как свойства, так и визуального эффекта, который применяется через установщик. (Я даже могу наблюдать это изменение, если поиграю со свойством в конструкторе Visual Studio!)

Однако, если я применю привязку данных к этому свойству, а затем изменю элемент, к которому оно привязано, значение свойства изменится, но метод установки никогда не будет вызван, и фактическое отображение никогда не изменится.

Например, если я определю кнопку и свой элемент управления:

  <my:MyControl x:Name="myControl1" SpinnerColour="{Binding ElementName=button1, Path=Background.Color, Mode=TwoWay}" />
  <Button Content="Button" Height="23" Name="button1" Click="button1_Click" />

И событие Click меняет цвет фона кнопок следующим образом:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        button1.Background = new SolidColorBrush(Colors.Red);
    }

Тогда, если я проверю свойство SpinnerColour с помощью отладчика, оно будет красным. Однако, как я написал, сеттер никогда не вызывается, и фактический элемент управления никогда не меняет свой цвет.

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

1 Ответ

2 голосов
/ 10 августа 2011

Вы неправильно используете свойства зависимостей.
Собственное свойство CLR, которое вызывает SetValue, используется только при установке свойства в коде.
Инфраструктура привязки вызывает SetValue напрямую (вместо использования отражения)поэтому ваш код никогда не запускается.

Никогда не следует помещать любой код, кроме GetValue и SetValue, в оболочку DependencyProeprty

Вместо этого вам нужно указать ValueChangedCallback вРегистрация DependencyProperty, как второй параметр конструктора PropertyMetadata.

...