首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法绑定到ListBox子ListBox

无法绑定到ListBox子ListBox
EN

Stack Overflow用户
提问于 2016-04-21 13:51:57
回答 1查看 70关注 0票数 0

我正在绑定到一个ListBox,并在ListBox中绑定另一个ListBox。

我的模特看起来

代码语言:javascript
复制
public interface ICriteriaDetail
{
    string Title { get; }
    int NumberOfEvents { get; }
    ICriteriaDetail ChildCriteria { get; }
}

因此,我对子级使用递归方法(而不是列表)。

当我绑定到我的ListView时,我得到一个列表中的项目,其中一个在另一个下面。

问题是,孩子的项目根本没有显示!

虚拟数据

代码语言:javascript
复制
  public static IEnumerable<ICriteriaDetail> GetCriteriaList()
    {
        var list = new List<CompoundCriteria.Ui.Model.Interfaces.ICriteriaDetail>();
        list.Add(GetCriteriaDetail("My Title", 5, false));
        list.Add(GetCriteriaDetail("Other", 3, false));
        list.Add(GetCriteriaDetail("Biggy", 8, true));

        var child = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("childAgain", 43, null);
        var child2 = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("childAgainAgain", 13, child);

        list.Add(new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("Really big", 86, new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("smaller", 15, child2)));

        return list;
    }

    private static ICriteriaDetail GetCriteriaDetail(string title, int events, bool hasChild)
    {
        if (!hasChild)
            return new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail(title, events, null);

        var child = new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail("child" + title, 13 + events, null);
        return new CompoundCriteria.Ui.Model.CriteriaDetail.CriteriaDetail(title, events, child);
    }

The ViewModel

代码语言:javascript
复制
    public MainWindowViewModel()
    {
        this.Criterias = DatasourceMockup.GetCriteriaList();
    }

    private IEnumerable<ICriteriaDetail> _criterias;
    public IEnumerable<ICriteriaDetail> Criterias
    {
        get { return _criterias; }
        set { _criterias = value; }
    }

以及XAML中的ListBox

代码语言:javascript
复制
 <ListBox ItemsSource="{Binding Criterias}" >
                    <ListBox.Resources>
                         <ControlTemplate x:Key="con">
                            <StackPanel Orientation="Horizontal">
                            <StackPanel Margin="15">
                                <TextBlock Text="{Binding Title}" />
                                <TextBlock Text="Events: ">
                                <Run Text="{Binding NumberOfEvents}" />
                                </TextBlock>
                             </StackPanel>
                             <ListBox ItemsSource="{Binding ChildCriteria} Visibility="{Binding ChildCriteria, Converter={StaticResource HideIfNull}}">">
                                    <ListBox.Resources>
                                        <DataTemplate DataType="{x:Type cDetail:CriteriaDetail}">
                                                <TextBlock Text="{Binding Title}" />
                                        </DataTemplate>
                                    </ListBox.Resources>
                                </ListBox>
                            </StackPanel>
                        </ControlTemplate>

                        <HierarchicalDataTemplate DataType="{x:Type cDetail:CriteriaDetail}">
                                <Control Template="{StaticResource con}" />
                        </HierarchicalDataTemplate>
                    </ListBox.Resources>
                </ListBox>

在阅读TreeView, HierarchicalDataTemplate and recursive Data之后,HierarchicalDataTemplate似乎就足够了(也不需要DataTemplate ),但是,我不明白为什么我没有看到我所期望的结果(即使孩子们不在我想要的地方,我仍然希望看到他们)。

编辑

我刚刚添加了一个转换器,如果绑定数据为null,它会使ListBox (ControlTemplate中的那个)隐藏起来。我有一个大纲(一个空的ListBox),只为其中的一个(这是正确的),但它没有绑定任何内容(标题)。输出窗口没有显示任何有用的..。

请注意,孩子是没有限制的。在上面的例子中,有一个父子关系,但它可以是父母子女子女等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-21 15:45:29

1)很难理解你的目的,为什么ListBox,如果你在模型中有ChildCriteria,而不是IEnumerable<ICriteriaDetail>

2)还有绑定错误,我将xaml更改为

代码语言:javascript
复制
<ListBox ItemsSource="{Binding Criterias}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <StackPanel Margin="15">
                            <TextBlock Text="{Binding Title}" />
                            <TextBlock Text="Events: ">
                                <Run Text="{Binding NumberOfEvents}" />
                            </TextBlock>
                </StackPanel>
                <TextBox Text="{Binding Path=DataContext.ChildCriteria.Title, 
                                        RelativeSource={RelativeSource Mode=FindAncestor, 
                                                        AncestorType={x:Type ListBoxItem}, 
                                                        AncestorLevel=1}}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

并得到了

EDIT1: 1)我将数据模型更改为

代码语言:javascript
复制
public class CriteriaDetail : ICriteriaDetail
{
    public CriteriaDetail(string title, int numberOfEvents, IEnumerable<ICriteriaDetail> childCriteria)
    {
        Title = title;
        NumberOfEvents = numberOfEvents;
        ChildCriteria = childCriteria;
    }

    public string Title { get; set; }
    public int NumberOfEvents { get; set; }
    public IEnumerable<ICriteriaDetail> ChildCriteria { get; set; }
}

2)将xaml改为

代码语言:javascript
复制
<TreeView ItemsSource="{Binding Criterias}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ChildCriteria}">
                <TextBlock Foreground="Red" Text="{Binding Title}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
</TreeView>

3)将GetCriteriaDetail更改为

代码语言:javascript
复制
    private static ICriteriaDetail GetCriteriaDetail(string title, int events, bool hasChild)
    {
        if (!hasChild)
            return new CriteriaDetail(title, events, null);

        var child3 = new CriteriaDetail("child3" + title, 13 + events, null);
        var child2 = new CriteriaDetail("child2" + title, 13 + events, new ICriteriaDetail[] { child3 });
        var child1 = new CriteriaDetail("child1" + title, 13 + events, new ICriteriaDetail[] { child2 });


        return new CriteriaDetail(title, events, new ICriteriaDetail[] {child1});
    }

还有这个。我觉得看上去更像是你想要的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36771749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档