我有一个名为GoalProgressControl的自定义用户控件。另一个用户控件包含GoalProgressControl,并通过XAML中的数据绑定设置其GoalName属性。但是,从不设置GoalName属性。当我在调试模式下检查时,GoalName对于控件的生命周期仍为“null”。
如何设置GoalName属性?有什么我做错了吗?
我正在使用.NET Framework 4和Silverlight 4.我对XAML和Silverlight相对较新,所以任何帮助都会非常感激。
我试图将GoalProgressControl.GoalName更改为POCO属性,但这会导致Silverlight错误,我的阅读使我相信数据绑定属性应该是DependencyProperty类型。我还简化了我的代码,只关注GoalName属性(代码如下),但没有成功。
这是GoalProgressControl.xaml:
<UserControl x:Class="GoalView.GoalProgressControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Height="100">
<Border Margin="5" Padding="5" BorderBrush="#999" BorderThickness="1">
<TextBlock Text="{Binding GoalName}"/>
</Border>
</UserControl>
GoalProgressControl.xaml.cs:
public partial class GoalProgressControl : UserControl, INotifyPropertyChanged
{
public GoalProgressControl()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public static DependencyProperty GoalNameProperty = DependencyProperty.Register("GoalName", typeof(string), typeof(GoalProgressControl), null);
public string GoalName
{
get
{
return (String)GetValue(GoalProgressControl.GoalNameProperty);
}
set
{
base.SetValue(GoalProgressControl.GoalNameProperty, value);
NotifyPropertyChanged("GoalName");
}
}
}
我已将GoalProgressControl放在另一页上:
<Grid Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="5" Background="#eee" Height="200">
<Border BorderBrush="#999" BorderThickness="1" Background="White">
<StackPanel>
<hgc:SectionTitleBar x:Name="ttlGoals" Title="Personal Goals" ImageSource="../Images/check.png" Uri="/Pages/GoalPage.xaml" MoreVisibility="Visible" />
<ItemsControl ItemsSource="{Binding Path=GoalItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--TextBlock Text="{Binding Path=[Name]}"/-->
<goal:GoalProgressControl GoalName="{Binding Path=[Name]}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
</Grid>
请注意上面注释掉的“TextBlock”项目。如果我在TextBlock中注释并注释掉GoalProgressControl,则绑定正常工作,TextBlock正确显示GoalName。此外,如果我用简单的文本字符串(例如“hello world”)替换上面的“GoalName”属性,控件将正确呈现,并且控件在呈现时会显示“hello world”。
答案 0 :(得分:4)
你必须通过
new PropertyMetadata(OnValueChanged)
作为DependencyProperty.Register调用的最后一个参数并设置属性
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((GoalProgressControl)d).GoalName = (String)e.NewValue;
}
答案 1 :(得分:0)
我写了一篇关于Silverlight 4自定义属性绑定的文章,您可能会发现它很有用,可以在这里找到: http://nick-howard.blogspot.com/2011/03/silverlight-4-custom-property-binding.html