2009-09-22 9 views
2

Je tente de créer un contrôle personnalisé dans Silverlight 3 et j'éprouve des problèmes étranges avec celui-ci.Problème lors de la connexion de données à un contrôle personnalisé dans Silverlight

Mon XAML pour le contrôle utilisateur est ceci:

<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> 

Le behind pour le contrôle utilisateur est ce

private string _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); 
     }    
    } 

Je vous appelle de l'adaptateur DataGridSelection (extrait de la page d'exemple Microsoft Toolkit pour la version AutoCompleteBox-Datagrid) - la partie pertinente se présente comme suit:

<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> 

je lance le code, et j'obtiens l'erreur "ManagedRuntimeError # 4004" - si j'essaie d'utiliser le contrôle personnalisé lors de la définition manuelle de la liaison de données, cela fonctionne très bien, si j'essaie de me fier aux valeurs qui sont databound, j'obtiens l'erreur. Comment puis-je créer un événement de databound personnalisé sur un contrôle personnalisé? Je pense que c'est le problème, que la page se charge avant que les valeurs lui soient passées.

Merci à tous.

~ Steve


mise à jour, voici le travail, changé le code selon la réponse acceptée

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; 
} 
+0

pouvez-vous poster le message d'erreur innerexception pour votre erreur? –

Répondre

2

Ceci est incorrect:

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

Le problème est que vous ne pouvez pas lier à une propriété qui n'est pas une propriété de dépendance. Voir ce MSDN article sur la transformation de votre propriété POCO en propriété de dépendance.

-Mark

+0

Merci Mark Il n'y avait en fait aucun lien attaché au message, juste fyi. –

+0

Désolé. Lien ajouté. Si vous vous liez, ça doit être un DP! – markti

Questions connexes