Проблема с привязкой данных к пользовательскому элементу управления в Silverlight - PullRequest
2 голосов
/ 22 сентября 2009

Я пытаюсь привязать данные к пользовательскому элементу управления в Silverlight 3, и у меня возникают странные проблемы с ним.

Мой xaml для пользовательского элемента управления выглядит так:

<UserControl x:Class="StronicoMain.GenericSmallIcon"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" >
    <Canvas x:Name="canGSI">

    </Canvas>
</UserControl>

Код для пользовательского элемента управления это

приватная строка _EntityTypeID;

    public string EntityTypeID
    {
        get
        {
            return _EntityTypeID;
        }

        set
        {
            _EntityTypeID = value;
        }
    }

    public GenericSmallIcon()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Page_Loaded);
    }        
    public void Page_Loaded(object sender, RoutedEventArgs e)
    {
        icoMale icoMale = new icoMale();
        icoFemale icoFem = new icoFemale();

        if (EntityTypeID == null)
        {
            canGSI.Children.Add(icoMale);
        }
        else if (EntityTypeID == "1")
        {
            canGSI.Children.Add(icoMale);
        }
        else if (EntityTypeID == "2")
        {
            canGSI.Children.Add(icoFem);
        }
        else
        {
            canGSI.Children.Add(icoMale);
        }            
    }

Я звоню из адаптера DataGridSelection (взято со страницы примера Microsoft Toolkit для версии AutoCompleteBox-Datagrid) - соответствующая часть выглядит следующим образом:

<Stron:DataGridSelectionAdapter x:Name="SelectionAdapter" AutoGenerateColumns="False" IsReadOnly="False">
                                                    <Stron:DataGridSelectionAdapter.Columns>
                                                        <data:DataGridTemplateColumn>
                                                            <data:DataGridTemplateColumn.CellTemplate>
                                                                <DataTemplate><Stron:GenericSmallIcon EntityTypeID="{Binding EntityTypeID}"></Stron:GenericSmallIcon></DataTemplate>
                                                            </data:DataGridTemplateColumn.CellTemplate>
                                                        </data:DataGridTemplateColumn>
                                                            <data:DataGridTextColumn Header="Contact Name" FontWeight="Bold" Foreground="#CC000000" Binding="{Binding EntityName}" />
                                                        <data:DataGridTextColumn Header="Tags" Binding="{Binding EntityTags}" />                                                        
                                                    </Stron:DataGridSelectionAdapter.Columns>
                                                </Stron:DataGridSelectionAdapter>

Я запускаю код и получаю сообщение об ошибке «ManagedRuntimeError # 4004» - если я пытаюсь использовать пользовательский элемент управления при ручной настройке привязки данных, он работает нормально, если я пытаюсь опираться на значения, привязанные к данным получите ошибку. Как я могу создать пользовательское событие с привязкой к данным в пользовательском элементе управления? Я думаю, что проблема в том, что страница загружается до того, как ей передаются значения.

Спасибо всем.

~ Стив


Обновление, вот рабочий, измененный код согласно принятому ответу

public static readonly DependencyProperty EntityTypeIDProperty = DependencyProperty.Register("EntityTypeID", typeof(string), typeof(GenericSmallIcon), new PropertyMetadata(new PropertyChangedCallback(GenericSmallIcon.OnEntityTypeIDPropertyChanged)));
public string EntityTypeID
{
    get { return (string)GetValue(EntityTypeIDProperty); }
    set { SetValue(EntityTypeIDProperty, value); }
}
private static void OnEntityTypeIDPropertyChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    GenericSmallIcon control = d as GenericSmallIcon;
    string b = (string)e.NewValue;
}

1 Ответ

2 голосов
/ 22 сентября 2009

Это недопустимо:

<Stron:GenericSmallIcon EntityTypeID="{Binding EntityTypeID}"/>

Проблема в том, что вы не можете привязать свойство, которое не является свойством зависимости.См. Эту статью MSDN о превращении вашего свойства POCO в свойство зависимости.

-Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...