问题 我正在创建一堆椭圆,我希望它们的填充画笔不透明度根据滑块值进行更改。我将滑块绑定到属性,并通过转换器将椭圆的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方法上设置断点,我发现在更新滑块时不会调用它。当我重新创建省略号时,它会被调用(正确)。
答案 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中声明)。