WPF双重绑定

时间:2011-01-27 16:04:51

标签: c# wpf binding

问题 我正在创建一堆椭圆,我希望它们的填充画笔不透明度根据滑块值进行更改。我将滑块绑定到属性,并通过转换器将椭圆的FillProperty绑定到同一属性。当我更新滑块时,省略号不会改变。但是,当我重新创建它们时,它们会发生变化。

我觉得Ellipse绑定没有看到我通过其他绑定所做的更改,因此不会更新。我不知道要设置什么标志以使其级联我对属性所做的更改,或者如果我需要将属性包装在某种奇特的对象中。

非常感谢任何帮助。

技术细节 我有一个类(:Window)声明一个名为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 {             / *我设置宽度,高度,边距,笔画......等             }; 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 个答案:

答案 0 :(得分:3)

问题在于,当您更改BubbleOpacity属性时,您不会通知任何人您已更改它。

要解决此问题,您可以实现INotifyPropertyChanged接口,并在BubbleOpacity属性更改时引发PropertyChanged事件。

另一种选择是将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中声明)。