0

2 つの TabItems を持つ WPF TabControl があります。各 TabItem には、個別の ObservableCollection を ItemsSource として持つ ListBox が含まれています。各 ListBox には異なる ItemTemplate があります。

起動時に選択するように設定した TabItem に関係なく、そのタブは正常に表示されますが、他のタブをクリックすると、DataTemplate を指している「呼び出しのターゲットによって例外がスローされました」というエラーでアプリケーションがクラッシュします切り替え先のタブ。

タブの ListBox から ItemTemplate を削除すると、切り替えようとしている (そして DisplayMemberPath を使用している) 場合、すべて正常に動作します。

ただし、インラインであるか、StaticResource または DynamicResource であるかに関係なく、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));

}

4

2 に答える 2

1

起動時に選択するように設定した TabItem に関係なく、そのタブは正常に表示されますが、他のタブをクリックすると、DataTemplate を指している「呼び出しのターゲットによって例外がスローされました」というエラーでアプリケーションがクラッシュします切り替え先のタブ。

ファーストチャンス例外を有効にすると、ラップされた外部例外ではなく実際の例外を見つけることができます。何が問題なのかがより明確になります。

于 2008-12-01T03:29:49.427 に答える
0

問題は、両方の ListBox の ItemSource="{Binding}" だと思います。これは Window の DataContext にバインドするように言っていると思いますが、コードでは個別に設定します。

Window.Resources で CollectionViewSource を宣言してみてください (ListBox 間で異なる並べ替えが必要な場合は 2 つ)。Observablecollection を CollectionViewSource のソースとして設定します。

次に、ListBoxes で CollectionView ソースへのバインドを行います。

これが機能しない場合は、各 ListBox とそれに関連付けられているデータ リソースを個別の UserControls に配置してみてください。

于 2008-12-01T02:13:05.073 に答える