0

我有一个带有两个 TabItems 的 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>

公共 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));

}

4

2 回答 2

1

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

启用第一次机会异常,这样您就可以找出实际的异常而不是包装的外部异常 - 出了什么问题会更清楚。

于 2008-12-01T03:29:49.427 回答
0

我认为问题在于 ListBox 的 ItemSource="{Binding}"。我认为这表示要绑定到 Window 的 DataContext,但在代码中您单独设置。

尝试在 Window.Resources 中声明一个 CollectionViewSource(或两个,如果您希望 ListBoxes 之间有不同的排序)。将 Observablecollection 设置为 CollectionViewSource 的来源。

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

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

于 2008-12-01T02:13:05.073 回答