ItemsPanelTemplate ListView выдает явно ошибочное исключение
Я создал пользовательский элемент управления, который содержит 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 ответ
Вы получаете это исключение, вероятно, потому что вы пытаетесь добавить "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), в которой приведены некоторые подробности этого поведения, которые могут помочь вам понять, почему это так.