【问题标题】:How to bind a list of list to a view?如何将列表列表绑定到视图?
【发布时间】:2013-11-25 18:09:11
【问题描述】:

有 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)上找不到“参数”属性。绑定表达式:路径=参数; DataItem='NestedClass' (HashCode=16626097);目标元素是'ItemsControl'(名称='');目标属性是“ItemsSource”(类型“IEnumerable”)

已编辑#1添加了 xaml

Edited#2添加了输出消息

Edited#3在 NestedClass 中添加了 name 属性

【问题讨论】:

  • 您是否尝试将内部ItemsControl的ItemsSource设置为Params?
  • @Sascha 你的意思是&lt;ItemsControl ItemsSource="{Binding Params}" &gt; 对吗?如果是对的,我已经试过了。它不起作用。
  • @groupgrip,你试过 吗?
  • @VasiliRuzov 是的,我已经尝试过了。作为我提出问题的示例代码。它不起作用。
  • 那些内心的Grids 太可怕了。为什么需要它们?

标签: c# wpf xaml mvvm


【解决方案1】:

无论您是否尝试过以及是否有效,正确的做法是如@groupgrip 所述:

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

DataTemplate 中的DataContext 将被设置为来自Child 集合的NestedClass 类型的项目。这个类有一个名为Params 的属性,所以我们可以在DataTemplate 中直接使用该属性Bind。该类中还应该有一个名为Count 的属性,因为您还尝试从DataTemplate 内部将Bind 转换为该属性。

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

【讨论】:

  • 谢谢。我忘了检查输出窗口。 System.Windows.Data Error: 40 : BindingExpression path error: 'Params' property not found on 'object' ''NestedClass' (HashCode=16626097)'. BindingExpression:Path=Params; DataItem='NestedClass' (HashCode=16626097); target element is 'ItemsControl' (Name=''); target property is 'ItemsSource' (type 'IEnumerable') 是这样说的。我仍然不知道为什么它不识别。请帮忙。
  • 嗯,你是对的......它不喜欢那样。我只能假设您没有像您展示的那样在您的类中定义了该属性。该属性是否未定义为public,或者是否存在拼写错误或其他问题。看看你的Count 属性,如果它没有抱怨那个……这两个属性的声明肯定有区别。
  • 谢谢。这是我的坏事。在我放的示例中是正确的,但我做的代码是错误的。我将其声明为字段而不是属性。
  • @groupgrip,为避免这种情况,切勿将代码重新输入到 stackoverflow。复制它
  • @groupgrip,如果这个答案和/或评论帮助解决了您的问题,请将其标记为正确答案,以便其他用户知道这个question has been answered是本网站的惯例。
【解决方案2】:

对于“父”类,使用 HierarchicalDataTemplate,对于子类 - 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>

【讨论】:

    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2023-03-14
    • 2013-04-05
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多