我有ItemsControl
绑定到ObservableCollection
。在ItemsControl
内部,我有另一个ItemsControl
,它绑定到最外层ObservableCollection
的ObservableCollection对象中包含的另一个ItemsControl
。当XAML解析器尝试构建最里面的ItemsControl
' DataTemplate
时,会抛出异常
System.Windows.Markup.XamlParseException:为集合添加值 type' System.Windows.Controls.ItemCollection'抛出异常。
,内部例外是:
System.InvalidOperationException:操作无效时 ItemsSource正在使用中。使用访问和修改元素 而不是ItemsControl.ItemsSource。
为了使它更清晰,这是我的XAML结构:
<Grid DataContext="{Binding ...Name of object holding ObservableCollection here}">
<ItemsControl Name="FilterItemsHolder" Grid.Row="1"
HorizontalAlignment="Stretch" VerticalAlignment="Top"
Margin="10,10,10,10" MinWidth="200"
Background="#151515"
ItemsSource="{Binding CheckedFilterColumns}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid MaxHeight="100">
<ItemsControl Name="FilterSelectionsHolder"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Margin="10,10,10,10" MaxHeight="50"
ItemsSource="{Binding FilterSelections}">
<DataTemplate>
<rb:RBFilterOptions x:Name="FilterOptions" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</DataTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
DataBound项的类结构是:
public class ClassThatHoldsCollections...
{
... some other properties
public ObservableCollection<RBDataColumn> CheckedFilterColumns { get; set; } //bound to outermost ItemsControl's (Name="FilterItemsHolder") ItemsSource
public ClassThatHoldsCollections...()
{
...initialize property values...
CheckedFilterColumns = new ObservableCollection<RBDataColumn>();
}
}
public class RBDataColumn
{
...some properties
public ObservableCollection<RBDataColumnFilterSelection> FilterSelections { get; set; } //bound to innermost ItemsControl's (Name="FilterSelectionsHolder") ItemsSource
public RBDataColumn()
{
...initialize property values...
FilterSelections = new ObservableCollection<RBDataColumnFilterSelection>();
}
}
奇怪的是,如果我注释掉<DataTemplate>...</DataTemplate>
,则不再抛出异常。如果我保留<DataTemplate></DataTemplate>
标记并仅注释<rb:RBFilterOptions.../>
中引用的用户控件,则仍会抛出异常,这意味着它不能是导致问题的基础用户控件。
在我看来,构建窗口的XAML解析器试图在仍然访问最外层的ItemsControl
时添加内部ItemsControl
的值。
我的问题,在两个方面,是:
ItemsControl
的{{1}}属性指向嵌套ItemsSource
?答案 0 :(得分:1)
线索出现在错误消息中,即您的XAML出现了问题。具体来说,您已将内部DataTemplate
声明为FilterSelectionsHolder
的直接子项,因此XAML解析器认为您将其添加为集合项而不是模板。尝试将内部DataTemplate
包裹在ItemsControl.ItemTemplate
块中。
有时它只需要第二组眼睛。 ;)