如何将列表列表绑定到视图?

时间:2013-11-13 08:21:39

标签: c# wpf xaml mvvm

有2个班级。一个是父类,它包含第二个类的列表作为属性。 第二类也有一个列表。

问题是应用程序没有绑定第二个类中的列表。

应用程序将显示从第二个类列表(在父类中)绑定的网格列表,每个网格将显示第二个类中列表中的信息。

现在每个网格都没有绑定值

Class Parent{
   public List<NestedClass> Child { get; set; }
    .
    .
    .
}

Class NestedClass{
    public ObservableCollection<SomeParameter> Params{ get; set; }
    public string Name
    {
        get
        {
            return "Hello world";                
        }
    }

    .
    .
    .
}

xaml如下。

    <ItemsControl  HorizontalContentAlignment="Stretch" ItemsSource ="{Binding Child}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource="{Binding Child.Params}" >
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="80"/>
                                    <ColumnDefinition Width="80"/>
                                </Grid.ColumnDefinitions>
                                <Grid Grid.Column="0">
                                    <TextBlock Text="{Binding Count}" />
                                </Grid>
                                <Grid Grid.Column="1"></Grid>
                                <Grid Grid.Column="2"></Grid>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>                    
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

输出窗口显示如下

  

System.Windows.Data错误:40:BindingExpression路径错误:'对象'''NestedClass'(HashCode = 16626097)'上找不到'Params'属性。 BindingExpression:路径=参数; DataItem ='NestedClass'(HashCode = 16626097); target元素是'ItemsControl'(Name =''); target属性是'ItemsSource'(类型'IEnumerable')

已编辑#1 已添加xaml

已编辑#2 添加了输出消息

已编辑#3 在NestedClass中添加了name属性

2 个答案:

答案 0 :(得分:0)

无论你是否尝试过它是否有效,正确的方法是@groupgrip提到:

<ItemsControl HorizontalContentAlignment="Stretch" ItemsSource="{Binding Child}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Params}">
                ...
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

DataContext的{​​{1}}将设置为DataTemplate集合中Child类型的项目。此类有一个名为NestedClass的属性,因此我们可以Params直接使用Bind内的属性。在该类中还应该有一个名为DataTemplate的属性,因为您还在Count内尝试Bind

无论哪种方式,解决这些类型的问题的方法是阅读Visual Studio的输出窗口中的错误。您经常会收到类似“无法在该对象上找到此属性”的错误,这些错误应该可以帮助您跟踪并解决任何问题。

答案 1 :(得分:0)

对于“Parent”类,使用HierarchicalDataTemplate,对于child - DataTemplate。在资源中定义两个模板。

<Grid>
    <Grid.Resources>
        <HierarchicalDataTemplate DataType="{x:Type vm:Parent}" ItemsSource="{Binding Children}">... </>
        <DataTemplate DataType="{x:Type vm:Child}">...</>
    </Grid.Resources>
    <ItemsControl ItemsSource="{Binding Parents}">...</>
</Grid>