Пользовательское свойство UserControl не устанавливается с помощью привязки данных XAML в Silverlight 4 - PullRequest
3 голосов
/ 05 мая 2010

У меня есть пользовательский элемент управления под названием 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».

Ответы [ 2 ]

4 голосов
/ 30 июля 2010

Вы должны пройти

    new PropertyMetadata(OnValueChanged)

в качестве последнего параметра для вызова DependencyProperty.Register и установки свойства

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((GoalProgressControl)d).GoalName = (String)e.NewValue;
    }
0 голосов
/ 19 мая 2011

Я написал статью о привязке пользовательских свойств Silverlight 4, которая может оказаться вам полезной, и ее можно найти здесь: http://nick -howard.blogspot.com / 2011/03/4-Silverlight-заказ свойство-binding.html

...