2008-12-01 59 views
0

我有一個WPF TabControl與兩個TabItems。每個TabItem都包含一個帶有獨立ObservableCollection作爲其ItemsSource的ListBox。每個ListBox都有一個不同的ItemTemplate。應用程序崩潰改變選項卡包含ListBoxes與ItemTemplates

無論我在啓動時選擇哪個TabItem,該選項卡都會顯示正常,但是當我點擊其他選項卡時,應用程序崩潰時會出現'調用目標引發異常'錯誤指向向我要切換到的選項卡的DataTemplate。

如果我從選項卡上的列表框中刪除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)); 

}

回答

1

無論我在啓動時選擇哪個TabItem,該選項卡都會顯示正常,但是當我點擊另一個選項卡時,應用程序崩潰時會出現'調用目標引發異常'指向我要切換到的選項卡的DataTemplate的錯誤。

啓用一次機會異常,因此您可以找出實際的異常而不是包裝的外部異常 - 出錯會更清楚。

+0

我挖入棧跟蹤,發現我的愚蠢錯誤。兩個DataTemplates每個都使用具有非常類似屬性的自定義控件。我已經將自定義控件1的DependencyProperty代碼複製並粘貼到自定義控件2,但忘記更改它所註冊的類型。 – bjh 2008-12-01 15:29:12

0

我認爲問題是,這兩個ListBox的的ItemSource = 「{結合}」。我認爲這是說綁定到窗口的DataContext,但在代碼中,你分開設置。

嘗試在Window.Resources中聲明一個CollectionViewSource(或兩個,如果你想在ListBox之間進行不同的排序)。將您的Observablecollection設置爲CollectionViewSource的源。

然後在您的ListBoxes中,綁定到CollectionView源。

如果這不起作用,您可以嘗試將每個ListBox及其關聯的數據資源放入單獨的UserControl中。

相關問題