2015-04-16 24 views
0

這是一個後續問題要一個我問here -如何將CustomControl屬性綁定到控件本身?

控制類有一個依賴屬性 -

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等。

而不是綁定到顏色屬性的滑塊的值,我想我需要綁定到一個MultiBinding顏色屬性使用滑塊值屬性。

編輯

這對我來說感覺就像我應該在哪裏執行MVVM的地方 - 誰能告訴我怎麼會去這樣做嗎?

+0

爲了清楚起見,這是您正在使用的CustomControl還是UserControl? – olitee

+0

UserControl - 抱歉; – Will

回答

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,並結合代碼隱藏的輸出顏色。

+0

啊,是的。這更有意義。 @威爾,Grx70關於綁定失去潛力的觀點是很好的。 – olitee

+0

自定義控件 - 沒關係;得到它了。 – Will

2

如果我理解的很好,你有一個userControl裏面有滑塊。 這就是我在Xaml中做到這一點的方法。

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

和其他屬性和其他滑塊一樣。

ADDED

在用戶控件需要添加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.

+0

@ will like^:) – olitee

+0

這似乎不工作 - 我正在測試通過使用自定義控件並將Label的填充顏色綁定到控件顏色屬性 - 調整它對標籤沒有任何作用。 – Will

+0

如何使用滑塊更改顏色?然後添加,Mode = TwoWay –

相關問題