WPF двойная привязка - PullRequest
       1

WPF двойная привязка

1 голос
/ 27 января 2011

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

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

Буду признателен за любую помощь,

Технические подробности У меня есть класс (: Window), который объявляет (public, auto) свойство с именем BubbleOpacity.В какой-то момент я создаю слайдер и привязываю его (Двусторонний) к своей собственности.

var slider = new Slider { Width = 150, Minimum = 0, Maximum = 1, Value = 0.2 };
slider.SetBinding(RangeBase.ValueProperty, new Binding("BubbleOpacity") { Source = this, Mode = BindingMode.TwoWay

Пока все хорошо.Затем я создаю несколько эллипсов.Один из этих эллипсов может выглядеть так:

var ellipse = new Ellipse {/ * Я установил Width, Height, Margin, Stroke ... etc.};ellipse.SetBinding (Shape.FillProperty, new Binding ("BubbleOpacity") {Source = this, Converter = new BrushOpacityConverter (new SolidColorBrush (Colors.LightGoldenrodYellow))});

Класс BrushOpacityConverter просто создает классновая кисть, основанная на переданном значении непрозрачности.Это выглядит так, если вы должны знать.

class BrushOpacityConverter : IValueConverter
{
    private readonly Brush _brush;

    public BrushOpacityConverter(Brush brush)
    {
        _brush = brush;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var brushclone = _brush.CloneCurrentValue();
        brushclone.Opacity = (double) value;
        return brushclone;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

Если я установлю точки останова на метод Convert, я вижу, что он не вызывается при обновлении моего ползунка.Когда я воссоздаю эллипсы, он вызывается (правильно).

1 Ответ

3 голосов
/ 27 января 2011

Проблема в том, что при изменении свойства BubbleOpacity вы никому не сообщаете о том, что изменили его.

Чтобы исправить это, вы можете реализовать интерфейс INotifyPropertyChanged и вызвать событие PropertyChanged при изменении свойства BubbleOpacity.

Другой вариант - объявить свойство BubbleOpacity как свойство зависимости, например:

public double BubbleOpacity {
   get { return (double)GetValue(BubbleOpacityProperty); }
   set { SetValue(BubbleOpacityProperty, value); }
}

public static readonly DependencyProperty BubbleOpacityProperty =
   DependencyProperty.Register("BubbleOpacity", typeof(double), typeof(Window), new UIPropertyMetadata(1d));

Я бы предпочел второй вариант (поскольку это свойство объявлено внутри объекта DependencyObject).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...