Silverlight:将子控件属性绑定到用户控件中的属性

时间:2009-01-07 18:57:25

标签: .net 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颜色绑定到它的用户控件BkColor属性的值?

5 个答案:

答案 0 :(得分:8)

通常当我看到这个问题时,答案是'你必须在代码中执行',这听起来像'Silverlight绑定不支持这个' - 所以你必须这样做'通过手动设置属性完全手动'。但事实并非如此:

Silverlight绑定确实支持这一点 - 它只是Silverlight XAML没有。

以下是基本上包裹UserControl的{​​{1}}的示例。在构造函数中,您运行可绑定到“用户控件属性”的绑定。希望如果他们将来更改XAML对此的支持,那么回来修复将是微不足道的。

<强>的App.xaml

DataForm

<强> AddressControl.xaml

<AddressControl MyHeader="Shipping Address"/>

可选:表示您已将代码中的值与评论绑定

<强> AddressControl.xaml.cs

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

这会将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); usercontrol上的MyHeader属性绑定到数据表单上的AddressControl属性。我将它设为“我的”仅仅是为了便于阅读 - 但我实际上在实际代码中只使用了“标题”。

真正的耻辱我们仍然无法在XAML中执行此操作,但它比我最初尝试捕获Header事件然后手动设置事物更好。

答案 1 :(得分:1)

唯一的方法是以编程方式进行(例如在BkColor的更改事件中(假设它的DependencyProperty)在控件的其他位置更改它。或者你可以使用ControlTemplate并使用TemplateBinding。如果你的UserControl是解决此问题的方法(例如,没有行为/方法/事件),然后用ContentControl替换您的用户控件并使用Template Bindng。

答案 2 :(得分:0)

看一下这篇博文:Workaround for missing ElementName in Silverlight 2.0 Binding。听起来它与你想要做的事情略有不同,但你可能会纠缠他的代码来做你想做的事情。祝好运! : - )

答案 3 :(得分:0)

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

答案 4 :(得分:0)

还有另一种选择。虽然看起来您无法绑定颜色值本身,但您可以绑定整个Background属性,如下所示:

&LT; Border BorderThickness =“2”BorderBrush =“Black”CornerRadius =“20”Background =“{Binding Path = Background}”/&gt;

......然后......

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