用户控件上的数据绑定仅部分工作(silverlight)

时间:2011-05-27 20:30:56

标签: silverlight data-binding user-controls

我不确定我在这里做错了什么。我昨晚花了一个小时来搞清楚,也许我只是愚蠢。

我创建了这个用户控件来显示带边框的文本,它使用数据绑定来填充样式和文本。

这是我从主页面调用它的方式:

<mynamespace:BorderedText x:Name="DateTime"
                   Grid.Column="1"
                   Grid.Row="0"
                   BorderStyle="{StaticResource borderStyle}"
                   LabelStyle="{StaticResource labelStyle}"
                   TextStyle="{StaticResource valueStyle}"
                   Label="Current Date/Time"                                           
                   Text="N/A" />

控件非常简单:

<UserControl x:Class="MyNamespace.BorderedText"
         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"
         d:DesignHeight="480"
         d:DesignWidth="480">

<Grid>
    <Border Name="border" Style="{Binding BorderStyle}">
        <StackPanel>
            <TextBlock Style="{Binding LabelStyle}"
                       Text="{Binding Label}" />
            <TextBlock Style="{Binding TextStyle}"
                       Text="{Binding Text}" />
        </StackPanel>
    </Border>
</Grid>

问题是所有数据绑定都有效,但Border数据绑定除外。我也试图绑定背景或任何其他属性的数据,但没有成功。 后面的代码设置了DependencyProperty属性,就是这样。请注意,数据绑定的DataContext是在构造函数中设置的。试图将其分配给网格或边界本身,但没有成功。 有没有人有任何线索或看到我在这里失踪的大事?

namespace MyNamespace
{
    public partial class BorderedText : UserControl
    {
        public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(BorderedText), new PropertyMetadata(null));

        public static readonly DependencyProperty LabelStyleProperty = DependencyProperty.Register("LabelStyle", typeof(Style), typeof(BorderedText), new PropertyMetadata(null));

        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(BorderedText), new PropertyMetadata(null));

        public static readonly DependencyProperty TextStyleProperty = DependencyProperty.Register("TextStyle", typeof(Style), typeof(BorderedText), new PropertyMetadata(null));

        public static readonly DependencyProperty BorderStyleProperty = DependencyProperty.Register("BorderStyle", typeof(Style), typeof(BorderedText), new PropertyMetadata(null));

        public BorderedText()
        {
            InitializeComponent();
            ((Grid)this.Content).DataContext = this;
            //((Border)this.Content).DataContext = this;
        }

        public string Label
        {
            set { SetValue(LabelProperty, value); }
            get { return (string)GetValue(LabelProperty); }
        }

        public Style LabelStyle
        {
            set { SetValue(LabelStyleProperty, value); }
            get { return (Style)GetValue(LabelStyleProperty); }
        }

        public string Text
        {
            set { SetValue(TextProperty, value); }
            get { return (string)GetValue(TextProperty); }
        }

        public Style TextStyle
        {
            set { SetValue(TextStyleProperty, value); }
            get { return (Style)GetValue(TextStyleProperty); }
        }

        public Style BorderStyle
        {
            set { SetValue(BorderStyleProperty, value); }
            get { return (Style)GetValue(BorderStyleProperty); }
        }
    }
}

----更新:

事实证明这是完全不同的,与数据绑定无关,这是正确连接的......

在borderStyle中,我使用这种语法作为背景属性:

        <Setter Property="Background">
            <Setter.Value>
                <SolidColorBrush>
                    <SolidColorBrush.Color>
                        <Color>
                            <Color.A>
                                100
                            </Color.A>
                            <Color.R>#95</Color.R>
                            <Color.B>#ED</Color.B>
                        </Color>
                    </SolidColorBrush.Color>
                </SolidColorBrush>
            </Setter.Value>
        </Setter>

显然适用于设计师,但不适用于手机。 将其更改为:

        <Setter Property="Background">
            <Setter.Value>
                <SolidColorBrush Color="#649500ED" />
            </Setter.Value>
        </Setter>

解决了问题

1 个答案:

答案 0 :(得分:0)

好吧,你忘了一件事......边境的DataContext! 为UserControl指定一个名称,然后您可以添加以下内容:

<TextBox Text="{Binding Path=MyText, ElementName=UserControlRoot}" />

这会起作用(至少它在WPF中对我有用,呵呵)