【问题标题】:Silverlight: Binding a child controls property to a property in a user controlSilverlight:将子控件属性绑定到用户控件中的属性
【发布时间】:2009-01-07 18:57:24
【问题描述】:

如果我定义了用户控件:

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>

如何将矩形中的 GradientStop 颜色绑定到它的用户控件 BkColor 属性的值?

【问题讨论】:

    标签: .net silverlight


    【解决方案1】:

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

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

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

    App.xaml

    <AddressControl MyHeader="Shipping Address"/>
    

    AddressControl.xaml

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

    可选:表示你已经用注释绑定了代码中的值

    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);
    

    这将我的AddressControl 用户控件上的MyHeader 属性绑定到数据表单上的Header 属性。我将其设为“我的”只是为了便于阅读——但实际上我在真实代码中只使用了“标题”。

    真遗憾,我们仍然无法在 XAML 中执行此操作,但它比我第一次尝试捕获 DataContextChanged 事件然后手动设置要好。

    【讨论】:

    • 非常感谢您的回答 - 它帮助我们弄清楚如何对控件进行直通绑定。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      看看这篇博文:Workaround for missing ElementName in Silverlight 2.0 Binding。听起来它与您尝试执行的操作有些不同,但是您可以争吵他的代码来做您想做的事情。祝你好运! :-)

      【讨论】:

        【解决方案4】:
        <LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442">                    
         <GradientStop Color="{TemplateBinding BackGround}" />
         <GradientStop Color="#00FFFFFF" Offset="1"/> </LinearGradientBrush>
        

        【讨论】:

          【解决方案5】:

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

          ...然后...

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多