应用程序崩溃,在包含列表框用的ItemTemplate改变标签
-
11-07-2019 - |
题
我有一个WPF的TabControl具有两个的TabItems。每个TabItem的包含一个独立的ObservableCollection作为其的ItemsSource一个列表框。每个列表框都有不同的ItemTemplate。
其中的TabItem我设置在启动时将被选择不管,该选项卡将被显示很好,但是当我点击其他标签上与应用程序崩溃错误朝向指向“异常已被调用的目标抛出”在DataTemplate中为我切换到标签。
如果我从我试图切换到选项卡上的ListBox中删除的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));
}
解决方案
其中的TabItem我设置在启动时将被选择不管,该选项卡将被显示很好,但是当我点击其他标签上与应用程序崩溃错误朝向指向“异常已被调用的目标抛出”所述的DataTemplate用于我切换到标签。
启用第一个机会异常,这样你就可以找出实际的异常,而不是包裹外例外 - 什么错将更加清晰
其他提示
我认为问题是,这两个列表框的的ItemSource =“{结合}”。我觉得这个说绑定到窗口的DataContext的,但在代码中设置了单独。
在您的Window.Resources尝试声明CollectionViewSource(或两个,如果你想列表框之间的不同种类)。设置您的ObservableCollection作为的CollectionViewSource的来源。
然后在你的列表框,不要结合的CollectionView源。
如果这不起作用,你可以尝试把每一个列表框和其相关的数据资源到单独的用户控件。