如何将CustomControl属性绑定到控件本身?

时间:2015-04-16 16:55:22

标签: c# wpf xaml mvvm colors

这是我问here -

的问题的后续问题

控件类具有依赖项属性 -

private static readonly DependencyProperty
    _Color = DependencyProperty.Register( "Color", typeof( Color ), typeof( ColorDefiner ), new PropertyMetadata( Colors.Black ) );

public Color Color {
    get { return ( Color )this.GetValue( ColorDefiner._Color ); }
    set { this.SetValue( ColorDefiner._Color, value ); }
}

在控件XAML中,如何访问该属性,以便我可以双向绑定到负责定义颜色属性的控件滑块?

修改

这是其中一个滑块的代码 -

<Slider
    x:Name="sdrRed" Height="32" Minimum="0" Maximum="1" Width="294" TickPlacement="Both"
    TickFrequency="0.01" Value="{Binding Color, Mode=TwoWay, ElementName=Me}">
</Slider>

MeUserControl的名称。我的想法是问题是因为我指的是Color.ScR等等。

我认为我需要使用Slider Value属性将Color属性绑定到MultiBinding,而不是将Slider的Value绑定到Color属性。

修改

这对我来说感觉就像是一个我应该实现MVVM的地方 - 有人可以告诉我,我可以在这里做些什么吗?

2 个答案:

答案 0 :(得分:2)

如果我理解的话,你有一个内置滑块的userControl。 这就是我在Xaml中执行此操作的方法。

<UserControl x:Name="MultiSlider">
...
<Slider Color="{Binding Color, ElementName="MultiSlider"}.../>
...
</UserControl>

和其他属性以及其他滑块一样。

ADDED

在User控件中,您需要添加4个依赖项属性:

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

    public static readonly DependencyProperty ColorProperty =
        DependencyProperty.Register("Color", typeof(Color), typeof(MySlider), new PropertyMetadata(Colors.Red));

其他属性

public double RValue
    {
        get { return (double)GetValue(RValueProperty); }
        set { SetValue(RValueProperty, value); }
    }

    public static readonly DependencyProperty RValueProperty =
        DependencyProperty.Register("RValue", typeof(double), typeof(MySlider), new PropertyMetadata(0, ValueChanged));

    private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var currentColor = (d as MySlider).Color;
        var newcolor = new Color() { R = (byte)e.NewValue, B = currentColor.B, G = currentColor.G };
        (d as MySlider).Color  = newcolor;
    }

然后对于Green和Blue,并注意NewValue的转换,我不知道滑块范围是否达到255.

答案 1 :(得分:1)

如果我理解正确,您希望将ColorDefiner.Color属性多重绑定到ColorDefiner内部的滑块。为了在XAML中执行此操作,您需要使用样式(由于样式的目标类型限制,您还需要指定完全限定的属性名称):

<UserControl ...>
    <UserControl.Style>
        <Style>
            <Setter Property="local:ColorDefiner.Color">
                <MultiBinding Converter="{StaticResource colorConverter}">
                    <Binding ElementName="sdrAlpha" Path="Value" Mode="TwoWay" />
                    <Binding ElementName="sdrRed" Path="Value" Mode="TwoWay" />
                    <Binding ElementName="sdrGreen" Path="Value" Mode="TwoWay" />
                    <Binding ElementName="sdrBlue" Path="Value" Mode="TwoWay" />
                </MultiBinding>
            </Setter>
        </Style>
    <UserControl.Style>
    <!-- sliders -->
</UserControl>

这种方法有一个很大的缺点 - 如果最终用户为控件设置样式或在Color属性上设置自定义绑定,则多重绑定将丢失。另一方面,如果最终用户为控件设置自定义内容,则滑块将消失。这就是为什么在这种情况下你应该考虑将CustomControl与模板一起使用而不是UserControl,并将输出颜色组合在代码隐藏中。