【问题标题】:How do I bind a CustomControl Property to the control itself?如何将 CustomControl 属性绑定到控件本身?
【发布时间】:2015-06-23 05:58:34
【问题描述】:

这是我问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 的地方 - 有人能告诉我如何在这里做吗?

【问题讨论】:

  • 为了清楚起见,您正在使用的是 CustomControl 还是 UserControl?
  • UserControl - 抱歉;

标签: c# wpf xaml mvvm colors


【解决方案1】:

如果我理解得很好,您有一个内部有滑块的 userControl。 这就是我在 Xaml 中执行以下操作的方式。

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

其他属性和其他滑块也是如此。

添加

在用户控件中需要添加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;
    }

然后是绿色和蓝色,注意 NewValue 的投射我不知道滑块范围是否达到 255。

【讨论】:

  • @Will ^^ 这样 :)
  • 这似乎不起作用 - 我正在通过使用自定义控件并将标签的填充颜色绑定到控件的颜色属性进行测试 - 调整它对标签没有任何作用。
  • 如何使用滑块更改颜色?然后添加 , Mode=TwoWay
  • 颜色由三个滑块控制在三个部分 - 一个用于 R,一个用于 G,一个用于 B。有一个多转换器应该接受来自 R 的值, G 和 B 滑块并返回纯色。我将模式设置为两种方式,但它不起作用。
  • 好,现在我明白了,所以滑块没有直接连接到颜色,你可以这样做,1分钟后看看编辑答案
【解决方案2】:

如果我理解正确,您希望将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,并在代码隐藏中组合输出颜色。

【讨论】:

  • 啊,是的。这更有意义。 @Will,Grx70 关于绑定可能丢失的观点是一个很好的观点。
  • 自定义控件 - 好的;明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多