Свойство Attach не возвращает значение - PullRequest
0 голосов
/ 06 октября 2009

У меня есть прикрепленное свойство, объявленное для моей пользовательской панели как:

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, она отправляет double.PositiveInfinite в методе Arrange и, следовательно, Arrange никогда не может установить значения. То же самое отлично работает, когда все используется само по себе

Спасибо

1 Ответ

0 голосов
/ 06 октября 2009

Даже я пытался сделать то же самое, и у меня не получилось в какой-то другой форме панели, я хотел настроить сетку, но она не работала.

Проблема в том, что ListBox может иметь только ListBoxItem в качестве своего реального логического потомка, а не какую-либо кнопку и т. Д., Когда вы добавляете Button или любой элемент на панели содержимого ListBox, когда он выполняется, ItemsPanel будет иметь своих непосредственных потомков как ListBoxItem Содержимое ListBoxItem будет добавленным элементом управления.

Так что во время выполнения это будет ваше визуальное дерево ...

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

По этой причине ваше имущество не работает.

Решение состоит в том, что вы пытаетесь установить свойство ListBoxItem в ItemContainerStyle равным WeightedPanel.Weight объекта DataContext. Я знаю, что это сбивает с толку.

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