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

Jer*_*emy 8 .net silverlight

如果我定义了用户控件:

public partial class MainFooter : UserControl
{
    public System.Windows.Media.Color BkColor;
}
Run Code Online (Sandbox Code Playgroud)

它是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>
Run Code Online (Sandbox Code Playgroud)

和使用:

<MyControls:MainFooter x:Name="rcrMainFooter"
                       BkColor="#FFE2B42A">
</MyControls:MainFooter>
Run Code Online (Sandbox Code Playgroud)

我如何将Rectangle中的GradientStop Color绑定到它的用户控件BkColor属性的值?

Sim*_*ver 8

通常当我看到这个问题提出答案是'你必须在代码中做',这听起来像'Silverlight绑定不支持这个' - 所以你必须通过设置' 完全手动 ' 来做到这一点手工财产.但事实并非如此:

Silverlight绑定确实支持这一点 - 它只是Silverlight XAML不支持.

这是一个UserControl基本上包装的例子DataForm.在构造函数中,您运行可绑定到"用户控件属性"的绑定.希望如果他们将来更改XAML对此的支持,那么返回并修复它将是微不足道的.

App.xaml中

<AddressControl MyHeader="Shipping Address"/>
Run Code Online (Sandbox Code Playgroud)

AddressControl.xaml

<UserControl>
    <DataForm Name="dfAddress" Header="BOUND IN CODE"/>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

可选:表示您已将代码中的值与注释绑定在一起

AddressControl.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);
Run Code Online (Sandbox Code Playgroud)

这会将MyHeader我的AddressControlusercontrol上的Header属性绑定到dataform上的属性.我将它设为"我的"仅仅是为了便于阅读 - 但我实际上在实际代码中只使用了"标题".

真正的耻辱我们仍然不能在XAML中做到这一点,但它比我最初尝试捕获DataContextChanged事件然后手动设置的东西更好.


Rob*_*Rob 0

请查看此博客文章:解决 Silverlight 2.0 Binding 中缺少 ElementName 的问题。听起来它与您想要做的事情有点不同,但是您也许可以调整他的代码来完成您想要的事情。祝你好运!:-)