我有一个带有两个TabItem的WPF TabControl . 每个TabItem包含一个ListBox,其中包含一个单独的ObservableCollection作为其ItemsSource . 每个ListBox都有一个不同的ItemTemplate .
无论我在启动时选择哪个TabItem,该选项卡都会正常显示,但是当我点击另一个选项卡时,应用程序崩溃,并且“调用目标已抛出异常”错误指向DataTemplate我要切换到的标签 .
如果我从选项卡上的ListBox中删除ItemTemplate我试图切换到(并使用DisplayMemberPath)一切正常 .
但是,如果我使用DataTemplate,无论是内联还是静态资源或动态资源,都会导致选项卡切换时崩溃 .
有任何想法吗?伪代码如下:
<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>
public Window1(){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));
}
2 回答
启用第一次机会异常,这样你就可以找出实际的异常而不是包装的外部异常 - 出错的地方会更清楚 .
我认为问题在于ListBox的ItemSource =“” . 我认为这表示绑定到Window的DataContext,但在代码中你单独设置 .
尝试在Window.Resources中声明一个CollectionViewSource(如果你想在ListBox之间有不同的排序,则为两个) . 将Observablecollection设置为CollectionViewSource的源 .
然后在ListBoxes中,绑定到CollectionView源 .
如果这不起作用,您可以尝试将每个ListBox及其关联的数据资源放入单独的UserControl中 .