2013-10-06 3 views
0

Вместо того, чтобы объявлять вкладку для каждого из ObservableCollections явно, как в первом приведенном ниже TabControl, мне нужно, чтобы они генерировались динамически, как во втором TabControl, и имеют ItemSource вложенного набора ListView для каждого из вложенных ObservableCollections.Binding ObservableCollection ObservableCollections для вложенного ListView в TabControl TabItems

Другими словами: Почему не связаны привязки ItemSource вложенных ListViews во втором TabControl? Есть ли способ установить индекс вложенного ObservableCollection в индекс содержащего ObservableCollection?

Или: Как сделать второй динамический TabControl и вложенные ListViews похожими на первый статический TabControl и вложенные ListViews?

using System.Collections.ObjectModel; 
using System.Windows; 

namespace GridViewColumns2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      ViewModel viewModel = new ViewModel(); 

      viewModel.ThingCollections = new ObservableCollection<ThingCollection>(); 

      viewModel.ThingCollections.Add(new ThingCollection { Name = "One" }); 
      viewModel.ThingCollections[0].Things = new ObservableCollection<Thing>(); 
      viewModel.ThingCollections[0].Things.Add(new Thing { Name = "One.One" }); 
      viewModel.ThingCollections[0].Things.Add(new Thing { Name = "One.Two" }); 
      viewModel.ThingCollections[0].Things.Add(new Thing { Name = "One.Three" }); 


      viewModel.ThingCollections.Add(new ThingCollection { Name = "Two" }); 
      viewModel.ThingCollections[1].Things = new ObservableCollection<Thing>(); 
      viewModel.ThingCollections[1].Things.Add(new Thing { Name = "Two.One " }); 
      viewModel.ThingCollections[1].Things.Add(new Thing { Name = "Two.Two" }); 
      viewModel.ThingCollections[1].Things.Add(new Thing { Name = "Two.Three" }); 

      DataContext = viewModel; 
     } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<ThingCollection> ThingCollections { get; set; } 
    } 

    public class ThingCollection 
    { 
     public string Name { get; set; } 

     public ObservableCollection<Thing> Things { get; set; } 
    } 

    public class Thing 
    { 
     public string Name { get; set; } 
    } 
} 



<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <TabControl> 
     <TabItem> 
      <TabItem.Header>One</TabItem.Header> 
      <TabItem.Content> 
       <ListView ItemsSource="{Binding Path=ThingCollections[0].Things}"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn Width="120" Header="Name" DisplayMemberBinding="{Binding Name}" /> 
         </GridView> 
        </ListView.View> 
       </ListView> 
      </TabItem.Content> 
     </TabItem> 
     <TabItem> 
      <TabItem.Header>Two</TabItem.Header> 
      <TabItem.Content> 
       <ListView ItemsSource="{Binding Path=ThingCollections[1].Things}"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn Width="120" Header="Name" DisplayMemberBinding="{Binding Name}" /> 
         </GridView> 
        </ListView.View> 
       </ListView> 
      </TabItem.Content> 
     </TabItem> 
    </TabControl> 

    <TabControl Grid.Column="1" ItemsSource="{Binding Path=ThingCollections}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <ListView ItemsSource="{Binding Path=ThingCollections[0].Things}"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn Width="120" Header="Name" DisplayMemberBinding="{Binding Name}" /> 
         </GridView> 
        </ListView.View> 
       </ListView> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 


</Grid> 

ответ

1

Когда вы находитесь в DataTemplate, то DataContext уже, что из пункта (в вашем случае ThingCollection класс

Таким образом, вместо:.

<ListView ItemsSource="{Binding Path=ThingCollections[0].Things}"> 

Использование:

<ListView ItemsSource="{Binding Path=Things}"> 

Чтобы диагностировать будущие ошибки привязки, нажмите F5 (начните отладку) а затем взгляните в окне вывода. Там будут записаны все ошибки привязки. В этом случае он указал бы, что он не может найти свойство с именем ThingCollections в объекте ThingCollection.

0

Удалить ThingCollections[0]. в BindingPath. DataContext будет установлен для вас справа ThingCollection.

<ListView ItemsSource="{Binding Path=Things}"> 
Смежные вопросы