2012-01-21 1 views
0

J'ai un contrôle utilisateur que j'utilise dans plusieurs endroits de mon projet. Je l'utilise pour afficher un champ, mais la mise en page est différente pour différents types de champs ... Ça marche bien quand je l'utilise en code et en dehors de n'importe quel template, mais ça ne fonctionne pas quand je l'utilise dans un datatemplate pour mon listview. La seule chose qu'il fait est de changer la mise en page, mais il ne montre pas les valeurs (comme le nom & description).Utilisez UserControl comme DataTemplate (avec plusieurs liaisons) dans listview

Je veux lier des propriétés comme le titre, la description & type qui sont propriétés attachées, mais ils ne semblent pas travailler dans le DataTemplate ... Ce sont les propriétés:

public string Title 
    { 
     get { return (string)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 
    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(string), typeof(ucBoardField), new UIPropertyMetadata("", new PropertyChangedCallback(UpdateTitle))); 

    public string Description 
    { 
     get { return (string)GetValue(DescriptionProperty); } 
     set { SetValue(DescriptionProperty, value); } 
    } 
    public static readonly DependencyProperty DescriptionProperty = 
     DependencyProperty.Register("Description", typeof(string), typeof(ucBoardField), new UIPropertyMetadata("", new PropertyChangedCallback(UpdateDescription))); 

    public string FieldTypeDescription 
    { 
     get { return (string)GetValue(FieldTypeDescriptionProperty); } 
     set { SetValue(FieldTypeDescriptionProperty, value); } 
    } 
    public static readonly DependencyProperty FieldTypeDescriptionProperty = 
     DependencyProperty.Register("FieldTypeDescription", typeof(string), typeof(ucBoardField), new UIPropertyMetadata("street", new PropertyChangedCallback(UpdateFieldTypeDescription))); 

Et ce sont leurs méthodes de mise à jour:

public static void UpdateTitle(DependencyObject sender, DependencyPropertyChangedEventArgs eventArgs) 
    { 
     ucBoardField bf = sender as ucBoardField; 
     if (bf == null) return; 
     if (bf.Field == null) bf.Field = new Field(); 

     bf.Field.Title = (string)eventArgs.NewValue; 
     bf.lblExtraTax.Text = bf.lblStation.Text = bf.lblStreetname.Text = bf.lblUtility.Text = bf.Field.Title; 
    } 
    public static void UpdateDescription(DependencyObject sender, DependencyPropertyChangedEventArgs eventArgs) 
    { 
     ucBoardField bf = sender as ucBoardField; 
     if (bf == null) return; 
     if (bf.Field == null) bf.Field = new Field(); 

     bf.Field.Description = (string)eventArgs.NewValue; 
     bf.lblCity.Text = bf.Field.Description; 
    } 
    public static void UpdateFieldTypeDescription(DependencyObject sender, DependencyPropertyChangedEventArgs eventArgs) 
    { 
     ucBoardField bf = sender as ucBoardField; 
     if (bf == null) return; 
     if (bf.Field == null) bf.Field = new Field(); 
     if (bf.Field.FieldType == null) bf.Field.FieldType = new FieldType(); 

     bf.Field.FieldType.Description = bf.FieldTypeDescription = (string)eventArgs.NewValue; 
     bf.ShowContent(); //updates layout 
    } 

Ils fonctionnent bien lorsqu'ils sont abordés dans le code, mais tout sauf pour FieldTypeDescription montrent leurs résultats dans le DataTemplate, voici comment je les lie:

<ListView> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <uc:ucBoardField 
        Id="{Binding Path=Field.Id}" 
        FieldTypeId="{Binding Path=Field.FieldTypeId}" 
        Title="{Binding Path=Field.Title}" 
        Description="{Binding Path=Field.Description}" 
        FieldTypeDescription="{Binding Path=FieldType.Description}" /> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

En fait, ils fonctionnent, mais les données ne sont pas affichées ... En outre, lorsque leur liaison est déclenchée, je reçois une erreur (ou avertissement) dans ma sortie:

System.Windows.Data Error: 40 : BindingExpression path error: 'Field' property not found on 'object' ''Field' (HashCode=64502806)'. BindingExpression:Path=Field.Title; DataItem='Field' (HashCode=64502806); target element is 'ucBoardField' (Name=''); target property is 'Title' (type 'String') 
System.Windows.Data Error: 40 : BindingExpression path error: 'Field' property not found on 'object' ''Field' (HashCode=64502806)'. BindingExpression:Path=Field.Description; DataItem='Field' (HashCode=64502806); target element is 'ucBoardField' (Name=''); target property is 'Description' (type 'String') 

Immobilier Le champ est juste l'objet avec toutes les informations sur le champ à afficher que je reçois du serveur. Et ce sont sur mon listview:

System.Windows.Data Warning: 40 : BindingExpression path error: 'Title' property not found on 'object' ''TextBlock' (Name='lblTitle')'. BindingExpression:Path=Title; DataItem='TextBlock' (Name='lblTitle'); target element is 'TextBlock' (Name='lblTitle'); target property is 'Text' (type 'String') 
System.Windows.Data Warning: 40 : BindingExpression path error: 'Description' property not found on 'object' ''TextBlock' (Name='lblDescription')'. BindingExpression:Path=Description; DataItem='TextBlock' (Name='lblDescription'); target element is 'TextBlock' (Name='lblDescription'); target property is 'Text' (type 'String') 

Il ne se bloque cependant ... pas ce que quelqu'un sait ce que je pourrais faire du mal, pourquoi je reçois ces erreurs et comment je pouvais les résoudre? Je vous remercie d'avance!

+0

Comment êtes-vous mise en place du ItemsSource pour le listview et al alors le DataContext? –

+0

Je reçois une liste de champs et j'ajoute chaque champ à travers un foreach et lvw.items.add (field); ... Je ne mets pas le datacontext si –

+0

Devrais-je définir le DataContext si je n'utilise pas ItemsSource? –

Répondre

0

Je viens d'avoir le même problème il y a quelques minutes:

Vous devez définir le DataContext, mais vous ne pouvez pas mettre à nouveau dans le contrôle:

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <uc:ucBoardField 
       DataContext="{Binding .}" 
       Id="{Binding Path=Field.Id}" 
       FieldTypeId="{Binding Path=Field.FieldTypeId}" 
       Title="{Binding Path=Field.Title}" 
       Description="{Binding Path=Field.Description}" 
       FieldTypeDescription="{Binding Path=FieldType.Description}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Mais si vous avez la suivant (ou similaire) dans votre UserControl il ne fonctionnera pas encore, parce que le DataContext sera écrasé à nouveau:

<UserControl ... 
      DataContext="{Binding RelativeSource={RelativeSource Self}}" 
      ...> 
+0

Je n'ai pas défini le DataContext dans mon UC, je vais essayer votre premier exemple de code! :-) –

+0

Ne fonctionne pas avec {Binding.}, Y a-t-il autre chose que je devrais vérifier? ou faire avec le DataContext dans codebehind? –

+0

Désolé, il semble y avoir quelque chose de différent et je ne peux pas vous dire ... – ChrFin

Questions connexes