2008-12-01 29 views
0

我有一个WPF TabControl与两个TabItems。每个TabItem都包含一个带有独立ObservableCollection作为其ItemsSource的ListBox。每个ListBox都有一个不同的ItemTemplate。应用程序崩溃改变选项卡包含ListBoxes与ItemTemplates

无论我在启动时选择哪个TabItem,该选项卡都会显示正常,但是当我点击其他选项卡时,应用程序崩溃时会出现'调用目标引发异常'错误指向向我要切换到的选项卡的DataTemplate。

如果我从选项卡上的列表框中删除ItemTemplate我试图切换到(并使用DisplayMemberPath)一切工作正常。

但是,如果我使用DataTemplate,无论它是内联还是StaticResource或DynamicResource,它都会导致标签切换崩溃。

任何想法?伪代码如下:


<Window x:Class="Example.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:objects="clr-namespace:Example.CoreObjects" 
    xmlns:controls="clr-namespace:Example.Controls" 
    > 
<Window.Resources> 
    <DataTemplate x:Key="ItemTemplateOne"> 
     <controls:CustomControlOne /> 
    </DataTemplate> 
    <DataTemplate x:Key="ItemTemplateTwo"> 
     <controls:CustomControlTwo /> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <TabControl Name="tabControl1"> 
     <TabItem Header="TabOne"> 
      <Grid> 
       <ScrollViewer> 
        <ListBox Name="ListBoxOne" 
          ItemsSource="{Binding}" 
          ItemTemplate="{StaticResource ItemTemplateOne}" 
          > 
         <ListBox.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel /> 
          </ItemsPanelTemplate> 
         </ListBox.ItemsPanel> 
        </ListBox> 
       </ScrollViewer> 
      </Grid> 
     </TabItem> 
     <TabItem Header="TabTwo"> 
      <Grid> 
       <ScrollViewer> 
        <ListBox Name="ListBoxTwo" 
          ItemsSource="{Binding}" 
          ItemTemplate="{StaticResource ItemTemplateTwo}" 
          > 
         <ListBox.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel /> 
          </ItemsPanelTemplate> 
         </ListBox.ItemsPanel> 
        </ListBox> 
       </ScrollViewer> 
      </Grid> 
     </TabItem> 
    </TabControl> 
</Grid> 

公共窗口1() { 的InitializeComponent();

ListBoxOne.DataContext = ObservableCollectionOne; 
CollectionViewOne = CollectionViewSource.GetDefaultView(ObservableCollectionOne); 
CollectionViewOne.SortDescriptions.Add(new SortDescription("SortProperty", ListSortDirection.Descending)); 

ListBoxTwo.DataContext = ObservableCollectionTwo; 
CollectionViewTwo = CollectionViewSource.GetDefaultView(ObservableCollectionTwo); 
CollectionViewTwo.SortDescriptions.Add(new SortDescription("SortProperty", ListSortDirection.Descending)); 

}

回答

1

无论我在启动时选择哪个TabItem,该选项卡都会显示正常,但是当我点击另一个选项卡时,应用程序崩溃时会出现'调用目标引发异常'指向我要切换到的选项卡的DataTemplate的错误。

启用一次机会异常,因此您可以找出实际的异常而不是包装的外部异常 - 出错会更清楚。

+0

我挖入栈跟踪,发现我的愚蠢错误。两个DataTemplates每个都使用具有非常类似属性的自定义控件。我已经将自定义控件1的DependencyProperty代码复制并粘贴到自定义控件2,但忘记更改它所注册的类型。 – bjh 2008-12-01 15:29:12

0

我认为问题是,这两个ListBox的的ItemSource = “{结合}”。我认为这是说绑定到窗口的DataContext,但在代码中,你分开设置。

尝试在Window.Resources中声明一个CollectionViewSource(或两个,如果你想在ListBox之间进行不同的排序)。将您的Observablecollection设置为CollectionViewSource的源。

然后在您的ListBoxes中,绑定到CollectionView源。

如果这不起作用,您可以尝试将每个ListBox及其关联的数据资源放入单独的UserControl中。

相关问题