2016-02-26 109 views
1

内一个ObservableCollection我有绑定到ObservableCollectionItemsControl。里面那个ItemsControl我有另一ItemsControl这势必会包含在最外层ItemsControl的的ObservableCollection的对象内的另一个ObservableCollection。当XAML解析器试图建立最里面ItemsControlDataTemplate有抛出的异常如何绑定嵌套的ItemsControl的ItemsSource嵌套母ItemControl的绑定项

System.Windows.Markup.XamlParseException:增加值 类型的集合‘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> 

数据绑定项目的阶级结构是:

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's。

我的问题,分为两个部分,IS:

  1. 为什么抛出的异常?
  2. 是否有嵌套ItemsControl(胡)的ItemsSource属性指出嵌套ObservableCollections的方法吗?

回答

1

的线索是在错误信息,即有出错了XAML。具体而言,您已经声明自己内心DataTemplateFilterSelectionsHolder直接孩子,所以XAML分析器认为你将其添加为集合项目,而不是一个模板。尝试将内部DataTemplate包装在ItemsControl.ItemTemplate块中。

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

+1

难以置信,我不敢相信我没有注意到!感谢您的帮助,我确信这将解决问题。我一直在头上撞墙。 – Kidiskidvogingogin