如果我定义了用户控件:
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属性的值?
答案 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