У меня есть пользовательский элемент управления под названием GoalProgressControl. Другой пользовательский элемент управления содержит GoalProgressControl и устанавливает его атрибут GoalName посредством привязки данных в XAML. Однако свойство GoalName никогда не устанавливается. Когда я проверяю его в режиме отладки, GoalName остается «нулевым» в течение срока службы элемента управления.
Как мне установить свойство 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. Кроме того, если я заменю указанное выше свойство «GoalName» на простую текстовую строку (например, «hello world»), элемент управления будет отображаться правильно, и при его отображении в элементе управления будет отображаться «hello world».