我刚开始使用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;
}
布拉赫,我希望有所帮助!确保实际更改属性!
答案 0 :(得分:1)
您应该将text属性输出到模型对象中并为其实现INotifyPropertyChanged,以便在更改时通知所有控件。由于XAML没有某种支持模型,因此只需要解决问题。