附加属性不返回值

时间:2009-10-05 20:26:39

标签: wpf attached-properties

我为自定义面板声明了附加属性:

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);
}

如果我将面板定义为:

,它可以正常工作
<local:WeightedPanel Grid.Row="0" Height="200">
    <Button local:WeightedPanel.Weight="8" />
    <Button local:WeightedPanel.Weight="2"/>
</local:WeightedPanel>

但如果我将此面板用作ItemsPanelTemplate ListBox,则它始终会返回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>

我还注意到,当在ListBox中使用自定义包装面板时,它会在Arrange方法中发送double.PositiveInfinite,因此Arrange永远不能设置值。当单独使用时,同样的工作正常

由于

1 个答案:

答案 0 :(得分:0)

即使我尝试了同样的东西,但它在其他面板形式中对我没有用,我想设置网格,但它没有用。

问题是,由于ListBox只能将ListBoxItem作为其真正的逻辑子,而不是任何Button等,当你在ListBox的内容窗格中添加Button或任何项目时,当它执行时,ItemsPanel将其直接子项作为ListBoxItem和ListBoxItem的内容将是您添加的控件。

所以在运行时这将是你的视觉树......

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

这是您附加财产无效的原因。

解决方案是,您尝试将ItemContainerStyle中的ListBoxItem属性设置为DataContext的WeightedPanel.Weight。我知道它令人困惑。

OR

您可以将ListBoxItem添加为子项..如

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