ItemsPanelTemplate ListView выдает явно ошибочное исключение - PullRequest
3 голосов
/ 27 августа 2009

Я создал пользовательский элемент управления, который содержит ListView с пользовательским ItemsPanelTemplate.

<UserControl x:Class="..."
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="thisUserControl">
<ListView ItemsSource="{Binding Source={StaticResource cvs}}"
          Name="mainListView">
    <ListView.GroupStyle>
        <GroupStyle>
            ...
        </GroupStyle>
    </ListView.GroupStyle>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <cd:TimeLinePanel UnitsPerSecond="{Binding ElementName=thisUserControl,Path=DataContext.UnitsPerSecond}" Start="{Binding ElementName=thisUserControl, Path=DataContext.Start}"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

DataContext из UserControl имеет два свойства Start и UnitsPerSecond. Поскольку я использую группы, я не могу просто написать

Start={Binding Path=.Start}

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

VisualTree of ItemsPanelTemplate должен быть одним элементом.

Очевидно, что ItemsPanelTemplate содержит только один элемент.

Так в чем может быть проблема? Моя пользовательская панель не создает никаких элементов. Это просто устраивает их.

1 Ответ

6 голосов
/ 17 сентября 2009

Вы получаете это исключение, вероятно, потому что вы пытаетесь добавить «Children» в TimeLinePanel (или вы переопределяете визуальное дерево панели и возвращаете что-то отличное от 1 в «VisualChildrenCount»). К сожалению, вы не можете изменить свойство «Children» панели, если оно создано внутри ItemsControl из-за ItemsPanelTemplate. За пределами ItemsControl проблем нет.

Кроме того, вы можете переопределить шаблон ListView на что-то вроде следующего - он работает в моем случае и избавляется от исключения.

<ListView.Template>
    <ControlTemplate>
        <cd:TimeLinePanel IsItemsHost="True" UnitsPerSecond="..."/>
    <ControlTemplate>
</ListView.ItemsPanel>

Существует статья CodeProject (http://www.codeproject.com/KB/WPF/ConceptualChildren.aspx), в которой приведены некоторые подробности этого поведения, которые могут помочь вам понять, почему это так.

...