1

而不是像下面的第一个 TabControl 那样为每个 ObservableCollections 显式声明一个选项卡,我需要它们像在第二个 TabControl 中那样动态生成,并将嵌套 ListView 的 ItemsSource 设置为每个嵌套的 ObservableCollections。

换句话说:为什么第二个 TabControl 中嵌套 ListViews 的 ItemSource 绑定不起作用?有没有办法将嵌套 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>
4

2 回答 2

3

当您在 a 中DataTemplate时, theDataContext已经是该项目的那个(在您的情况下是一个ThingCollection类。

所以而不是:

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

利用:

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

要诊断未来的绑定错误,请按 F5(开始调试),然后查看输出窗口。所有装订错误都将记录在那里。在这种情况下,它会表明它找不到ThingCollections在 object 中命名的属性ThingCollection

于 2013-10-06T10:45:09.480 回答
1

ThingCollections[0].在 BindingPath 中删除。DataContext将为您设置正确的 ThingCollection 。

<ListView ItemsSource="{Binding Path=Things}">
于 2013-10-06T10:45:40.477 回答