如何将嵌套的ItemsControl ItemsSource绑定到嵌套在父ItemControl的绑定项中的ObservableCollection

时间:2016-02-26 02:42:29

标签: c# wpf xaml

我有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的值。

我的问题,在两个方面,是:

  1. 为什么抛出异常?
  2. 有没有办法让嵌套ItemsControl的{​​{1}}属性指向嵌套ItemsSource

1 个答案:

答案 0 :(得分:1)

线索出现在错误消息中,即您的XAML出现了问题。具体来说,您已将内部DataTemplate声明为FilterSelectionsHolder的直接子项,因此XAML解析器认为您将其添加为集合项而不是模板。尝试将内部DataTemplate包裹在ItemsControl.ItemTemplate块中。

有时它只需要第二组眼睛。 ;)