Silverlight UserControl数据绑定问题

时间:2011-08-29 01:12:50

标签: c# silverlight user-controls expression-blend

我刚开始使用Expression Blend,我正在尝试创建一个自定义UserControl,它将属性公开给控件的属性侧面菜单,该菜单可以更新视图的不同方面。例如,我想在Blend的Properties侧面菜单中公开名为“Text”的属性,该属性绑定到UserControl中的TextBlock。

这是UserControl的XAML:

<UserControl
    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"
    x:Class="XDAFacebook.XFItemGrid"
    d:DesignWidth="148" d:DesignHeight="200">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid>
            <Grid Height="148" Margin="0" VerticalAlignment="Top">
                <Image Height="148" Margin="0" Source="feeds.png" Stretch="Fill" VerticalAlignment="Bottom">
                    <Image.Clip> 
                        <RectangleGeometry RadiusX="10" RadiusY="10" Rect="0,0,148,148" /> 
                    </Image.Clip> 
                </Image>
                <Rectangle Fill="#00EBEBEC" Margin="0,0,0,0" Stroke="#FFB5B5B5" StrokeThickness="2" RadiusX="10" RadiusY="10"/>
            </Grid>
            <TextBlock x:Name="MainText" Height="33" Margin="8,0,11,13" TextWrapping="Wrap" Text="{Binding Text}" VerticalAlignment="Bottom" Foreground="#FF606060" HorizontalAlignment="Center" FontWeight="Bold" FontSize="24"/>
        </Grid>
    </Grid>
</UserControl>

以下是该控件的代码隐藏:

[Description("Items for Main Grid")]
public partial class XFItemGrid : UserControl
{
    public XFItemGrid()
    {
        // Required to initialize variables
        InitializeComponent();
    }

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

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).Text = (String)e.NewValue;
    }

    [Description("Main Text to be displayed in the control")]
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

我可以在属性侧菜单的Misc部分看到属性“Text”,但是当我更新它时,TextBlock中没有任何变化。

最后我想对Image Source也做同样的事情,但如果那是另一篇帖子,请告诉我,我会把它放在另一个帖子中。

编辑 -

Dang,我发现了错误......我认真地想我疯了!但事实证明我从来没有正确设置属性。

以下是需要更改的代码:

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).Text = (String)e.NewValue;
    }

为:

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).MainText = (String)e.NewValue;
    }
布拉赫,我希望有所帮助!确保实际更改属性!

1 个答案:

答案 0 :(得分:1)

您应该将text属性输出到模型对象中并为其实现INotifyPropertyChanged,以便在更改时通知所有控件。由于XAML没有某种支持模型,因此只需要解决问题。