首页 文章

应用程序在更改包含带有ItemTemplates的ListBox的选项卡时崩溃

提问于
浏览
0

我有一个带有两个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 回答

  • 0

    无论我在启动时选择哪个TabItem,该选项卡都会正常显示,但是当我单击另一个选项卡时,应用程序崩溃,并且“调用目标已抛出异常”错误指向DataTemplate对于我要切换到的标签 .

    启用第一次机会异常,这样你就可以找出实际的异常而不是包装的外部异常 - 出错的地方会更清楚 .

  • 1

    我认为问题在于ListBox的ItemSource =“” . 我认为这表示绑定到Window的DataContext,但在代码中你单独设置 .

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

    然后在ListBoxes中,绑定到CollectionView源 .

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

相关问题