Wpf数据将列表框绑定到嵌套类

时间:2011-05-13 08:44:19

标签: wpf data-binding

所以我有以下情况:

我有一个视图模型的类部分如下:

  public class ResourceModuleAccess
{ 
    public class ModuleAccess
    {
        ResourceModule module;
        Mode mode;
    }

    public List<DisplayAccess> Items
    {
        get
        {
            var result = from g in groups
                         join p in groupAccess on g.GroupID equals p.GroupId into outer
                         from p in outer.DefaultIfEmpty()
                         select new DisplayAccess { Name = g.Name, Module = (p == null) ? ResourceModule.None : p.Module };
            var output =  result.ToList();
            return output; 
        }

    }

我正在尝试将项目数据绑定到列表框以显示名称和模块

<ListBox ItemsSource="{Binding ModulesAccess.Items}">                   
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Label Content="{Binding DisplayAccess.Name}"></Label>
                                <CheckBox></CheckBox>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>                          
                </ListBox>

列表框正确显示项目,因此它找到了集合,但无法将属性映射到标签

我也试过

   <DataTemplate DataType="{x:Type DisplayAccess}">
                            <StackPanel Orientation="Horizontal">
                                <Label Content="{Binding Name}"></Label>
                                <CheckBox></CheckBox>
                            </StackPanel>
                        </DataTemplate>

但是没有构建:它说它无法找到公共类型DisplayAccess。

2 个答案:

答案 0 :(得分:2)

您的ModulesAccess.ItemsDisplayAccess的列表,因此您的列表框项目模板的数据上下文已经是单个DisplayAccess对象。

鉴于此,您应该能够在第一个示例中绑定到Name而不是DisplayAccess.Name

您的第二个示例也应该有效但您可能需要使用命名空间限定类型,例如

<DataTemplate DataType="{x:Type yourns:DisplayAccess}">
    ....
</DataTemplate>

顺便说一句,您经常会发现绑定错误被写入visual studio中的Output窗口(Debug / Windows / Output菜单),它可以指示您出错的地方。

答案 1 :(得分:0)

对于遇到类似问题的人:显示访问字段应为属性。

 public class DisplayAccess
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    private ResourceModule module;

    public ResourceModule Module
    {
        get { return module; }
        set { module = value; }
    }
}