第一次设置source时,绑定的WPF Rectangle.Fill不会更新

时间:2012-06-28 07:12:16

标签: wpf binding user-controls rectangles

我有一个非常原始的colorpicker工具(在WPF中)。这是它的外观:

enter image description here

如您所见,您可以在这些非常丑陋的滑块上按HSV或RGB设置颜色:)并更新Rectangle的Fill属性。

由于没有讨论的原因,这个ColorPicker是一个UserControl。

它有大量的DependencyProperties(主要用于颜色操作):Hue,Sat,Value,R,G,B;以及这些值的混合颜色:RGBColor和HSVColor。

这是罪魁祸首RGBColor:

public Color RGBColor
    {
        get { return (Color)GetValue(RGBColorProperty); }
        set { SetValue(RGBColorProperty, value); }
    }

    // Using a DependencyProperty as the backing store for RGBColor.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RGBColorProperty =
        DependencyProperty.Register("RGBColor", typeof(Color), typeof(SimpleColorPicker), new UIPropertyMetadata(Colors.Transparent, (d, e) =>
        {
            var colorpicker = d as SimpleColorPicker;
            if (e.NewValue != null && colorpicker != null)
            {

                var c = (Color)e.NewValue;

                if (c.R != colorpicker.R) colorpicker.R = c.R;
                if (c.G != colorpicker.G) colorpicker.G = c.G;
                if (c.B != colorpicker.B) colorpicker.B = c.B;

                colorpicker.RGBBrush = new SolidColorBrush(colorpicker.RGBColor);

                if (colorpicker._fromRGB)
                {
                    var hsv = HSVColor.FromColor(c);
                    if (colorpicker.HSVColor == null || !colorpicker.HSVColor.Equals(hsv))
                        colorpicker.HSVColor = hsv;
                }

                colorpicker.forceDisplayRefresh();
            }

        }));

在XAML部分中,我使用以下内容将RGBColor转换为矩形:

<Rectangle Height="100" x:Name="DisplayRectangle">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding RGBColor, Mode=OneWay}" />
    </Rectangle.Fill>
</Rectangle>

(此时DataContext是控件本身,因为我不想在所有绑定上使用FindAncestor,所以在ColorPicker构造函数中我有LayoutRoot.DataContext = this;其中LayoutRoot是控件的根网格。)

我正在尝试在View中使用此控件。我有一个用于实现INotifyPropertyChanged的View的VM,并且有一个notify-property(它是如何调用的?)

public Color Color
{
    get { return _color; }
    set
    {
        _color = value;
        RaisePropertyChanged(() => Color);
    }
}

我想用Colorpicker编辑这个属性(DataContext是VM):

<base:SimpleColorPicker RGBColor="{Binding Color}"/>

编辑本身有效。当我调整颜色选择器上的滑块时,会在VM中设置Color属性。

但是,当我加载已经设置了颜色的VM时,Rectangle将不会更新。滑块可以,并且所有DependencyProperties都设置为正确的值,但Rectangle的Fill不会改变。 (它保留Transparent,这是RGBColor DependencyProperty的默认值。 (再次,加载后,如果我调整滑块,矩形会再次更新......)

已经失败的事情:

  • 我尝试过使用Brush并直接绑定Fill属性(相反 of Fill.Color)
  • 我试过直接更新绑定 Rectangle.Fill

还有什么可以尝试使这项工作?

0 个答案:

没有答案