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