如何将控件的属性绑定到控件元素的属性?

时间:2012-11-03 09:36:21

标签: silverlight windows-phone-7

我需要对我的Windows手机应用程序进行数字控制。

我尝试创建自定义控件但我无法将控件的属性绑定到控件的元素。

我在控件中添加了一个依赖属性

public static readonly DependencyProperty LineThicknessProperty =
            DependencyProperty.Register("LineThickness", typeof (double), typeof (DigitControl), new PropertyMetadata(default(double)));

[DefaultValue(10D)]
public double LineThickness
{
    get { return (double) GetValue(LineThicknessProperty); }
    set { SetValue(LineThicknessProperty, value); }
}

并尝试将其绑定到控件的元素

<UserControl x:Class="Library.DigitControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <Grid x:Name="LayoutRoot">
    <Rectangle Margin="0" StrokeThickness="0" Width="{Binding LineThickness, RelativeSource={RelativeSource Self}}" Fill="#FFFF5454" RadiusX="5" RadiusY="5"/>
    </Grid>
</UserControl>

但它不起作用。是将该属性绑定到元素属性的方法吗?

2 个答案:

答案 0 :(得分:1)

在后面的代码中执行。

设置名称:

<Rectangle x:Name="theRect" Margin="0" StrokeThickness="0" Fill="#FFFF5454" RadiusX="5" RadiusY="5"/>

然后在代码背后:

theRect.SetBinding(Rectangle.WidthProperty, new Binding("LineThickness"){Source = this});

不适用于使用Visual Studio的PC,所以applogies如果不是100%可编译的!但是给你一般的想法。

答案 1 :(得分:0)

你做了什么不会工作,因为RelativeSource={RelativeSource Self}将源设置为目标对象,在你的情况下是矩形。

由于矩形没有LineThickness属性,因此绑定失败。

要获得正确的绑定,您可以执行多项操作。

最好的方法可能是在UserControl构造函数中设置this.DataContext = this;,然后在XAML中将绑定设置为Width="{Binding LineThickness}"

或者你可以定位UserControl类型的最近元素,并在那个上找到属性,如果你不想设置Datacontext:

Width="{Binding LineThickness, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"  

<强>更新
您还可以简单地为UserControl指定一个名称,并使用绑定中的ElementName属性引用它:

<UserControl x:Name="uc1" ... </UserControl>

Width="{Binding LineThickness, ElementName=uc1}"