2009-01-07 110 views
8

如果我有一個用戶定義的控制:的Silverlight:綁定子控件屬性的屬性在用戶控件

public partial class MainFooter : UserControl 
{ 
    public System.Windows.Media.Color BkColor; 
} 

,它的XAML:

<UserControl x:Class="Test.MainFooter"> 
    <Grid x:Name="LayoutRoot"> 
     <Rectangle x:Name="rctBottom_Background2" 
        HorizontalAlignment="Stretch" 
        Grid.Row="2"> 
      <Rectangle.Fill> 
       <LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442"> 
        <GradientStop Color="{**How can I bind this to the BkColor property?}"/**> 
        <GradientStop Color="#00FFFFFF" Offset="1"/> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
    </Grid> 
</UserControl> 

和使用:

<MyControls:MainFooter x:Name="rcrMainFooter" 
         BkColor="#FFE2B42A"> 
</MyControls:MainFooter> 

我該如何去將Rectangle中的GradientStop Color綁定到它的用戶控件BkColor屬性的值?

回答

1

唯一的方法是通過編程(例如在BkColor的變化事件中(假設它的DependencyProperty)在控件的其他位置更改它)或者可以使用ControlTemplate並使用TemplateBinding。如果你的用戶控件是解決類似的問題(例如,沒有行爲/方法/事件),然後用ContentControl中替換您的用戶控制和使用模板Bindng。

0
<LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442">      
<GradientStop Color="{TemplateBinding BackGround}" /> 
<GradientStop Color="#00FFFFFF" Offset="1"/> </LinearGradientBrush> 
8

每每當我看到這個問題提出的答案是'你必須在代碼中完成',這聽起來像'Silverlight綁定不支持這個' - 所以你必須通過設置prope來完成''完全手動'手動。但事實並非如此:

Silverlight綁定確實支持這一點 - 它只是沒有的Silverlight XAML。

下面是UserControl的一個示例,它基本上包裝了DataForm。在構造函數中,您運行可綁定到「用戶控件屬性」的綁定。希望如果他們在將來更改XAML對此的支持,那麼返回並修復它將是微不足道的。

的App.xaml

<AddressControl MyHeader="Shipping Address"/> 

AddressControl.xaml

<UserControl> 
    <DataForm Name="dfAddress" Header="BOUND IN CODE"/> 
</UserControl> 

可選: indidicate你已經勢必碼值與評論

AddressContr ol.xaml.cs

publicAddressControl() 
{ 
    InitializeComponent(); 

    // bind the HeaderProperty of 'dfAddress' to the 'MyHeader' dependency 
    // property defined in this file 
    dfAddress.SetBinding(DataForm.HeaderProperty, 
    new System.Windows.Data.Binding { Source = this, 
             Path = new PropertyPath("MyHeader") }); 
} 

// standard string dependency property 
public string MyHeader 
{ 
    get { return (string)GetValue(MyHeaderProperty); } 
    set { SetValue(MyHeaderProperty, value); } 
} 

public static readonly DependencyProperty MyHeaderProperty = 
     DependencyProperty.Register("MyHeader", typeof(string), 
     typeof(AddressControl), null); 

這結合我AddressControl用戶控件對數據形的Header屬性MyHeader財產。爲了方便閱讀,我製作了「我的」 - 但我實際上只使用「標題」。

真正的恥辱我們仍然無法在XAML中做到這一點,但它比我第一次嘗試捕獲DataContextChanged事件然後手動設置事件更好。

+0

很多很多感謝這個答案 - 它幫助我們弄清楚怎麼辦直通上的控件綁定。 – Quango 2011-08-12 10:07:37

0

還有一個選擇。儘管看起來您無法綁定顏色值本身,但您可以綁定整個Background屬性,如下所示:

< Border BorderThickness =「2」BorderBrush =「Black」CornerRadius =「20」Background =「{Binding Path =背景}」 />

...然後...

Public ReadOnly Property Background As Brush 
    Get 
     Dim lgb As New LinearGradientBrush 
     lgb.GradientStops = New GradientStopCollection From {New GradientStop With {.Color = PrimaryColor, .Offset = 0.0}, New GradientStop With {.Color = SecondaryColor, .Offset = 1.0}} 
     lgb.StartPoint = New Point(0, 0) 
     lgb.EndPoint = New Point(1, 1) 
     Return lgb 
    End Get 
End Property 
相關問題