2009-10-05 8 views
0

J'ai une propriété attachée déclarée pour mon panneau personnalisé comme:Fixer la propriété ne retourne pas la valeur

public static readonly DependencyProperty WeightProperty = DependencyProperty.RegisterAttached(
     "Weight", typeof(double), typeof(WeightedPanel), 
       new FrameworkPropertyMetadata(1.0, 
        FrameworkPropertyMetadataOptions.AffectsParentMeasure | 
        FrameworkPropertyMetadataOptions.AffectsParentArrange)); 

public static void SetWeight(DependencyObject obj, double weight) 
{ 
    obj.SetValue(WeightProperty, weight); 
} 

public static double GetWeight(DependencyObject obj) 
{ 
    return (double) obj.GetValue(WeightProperty); 
} 

Il fonctionne très bien si je définis le panneau comme:

<local:WeightedPanel Grid.Row="0" Height="200"> 
    <Button local:WeightedPanel.Weight="8" /> 
    <Button local:WeightedPanel.Weight="2"/> 
</local:WeightedPanel> 

Mais si je l'utilise ce panneau comme ItemsPanelTemplate pour un ListBox, il retourne toujours la valeur par défaut dans ArrangeOverride.

<ListBox Grid.Row="2" Height="100"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <local:WeightedPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <Button local:WeightedPanel.Weight ="6" /> 
    <Button local:WeightedPanel.Weight ="4"/> 
</ListBox> 

J'ai aussi remarqué que lorsque le panneau d'emballage personnalisé est utilisé dans un ListBox, il envoie double.PositiveInfinite dans Arrangez méthode et donc Arrangez est jamais en mesure de définir les valeurs. Les mêmes œuvres fines lorsqu'il est utilisé par lui-même

Merci

Répondre

0

Même j'ai essayé même et cela n'a pas fonctionné pour moi dans une autre forme de panneau, je voulais la grille de configuration, mais cela n'a pas fonctionné. Le problème est, puisque ListBox ne peut avoir que ListBoxItem en tant que son enfant logique réel, pas n'importe quel bouton etc, quand vous ajoutez Button ou n'importe quel élément dans le volet de contenu de ListBox, le ItemsPanel aura ses enfants immédiats comme ListBoxItem Le contenu de ListBoxItem sera le contrôle que vous avez ajouté.

Donc, lors de l'exécution ce sera votre arbre visuel ...

ItemsControl (ListBox) 
    ItemsPanel (WeightedPanel) 
      ListBoxItem 
       Button 
      ListBoxItem 
       Button... 

C'est la raison pour laquelle votre propriété attachée ne fonctionne pas.

La solution serait, vous essayez de définir la propriété ListBoxItem dans le ItemContainerStyle à être WeightedPanel.Weight de DataContext. Je sais que c'est déroutant.

OU

Vous pouvez ajouter ListBoxItem comme enfant .. comme

<ListBox> 
    <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <local:WeightedPanel /> 
      </ItemsPanelTemplate>   
     </ListBox.ItemsPanel> 
    <ListBoxItem local:WeightedPanel.Weight="4"><Button/></ListBoxItem> 
    <ListBoxItem local:WeightedPanel.Weight="4"><Button/></ListBoxItem> 
</ListBox> 
+0

Akash, Très bonne explication. Je savais que Listbox utilise listboxitem comme présentateur pour son article. Là où j'étais absent était le fait que les propriétés de rattachement s'attachent à chaque élément. Depuis que j'attachais les propriétés au bouton (pas ListBoxItem), je n'étais pas capable d'obtenir les valeurs. Pourriez-vous développer plus sur la première solution que vous avez donné où vous avez suggéré d'utiliser ItemContainerStyle. La deuxième solution fonctionne très bien. Merci un million – Sheraz

Questions connexes