C# 在「;“家长”;数据绑定对象的定义?

C# 在「;“家长”;数据绑定对象的定义?,c#,wpf,data-binding,datatemplate,C#,Wpf,Data Binding,Datatemplate,我有一个带有两个字符串数组的对象。对象是绑定到列表框的数据。一个列表绑定为列表的ItemsSource。另一个是给我带来麻烦的东西,它需要绑定到一个组合框,该组合框是设置为列表的ItemTemplate的DataTemplate的一部分。基本上,列表框上的每个项目都有第一个列表的对应元素和包含第二个列表的组合框。换句话说,列表中的每个项目都有相同的选项组合框 问题来自这样一个事实,即DataTemplate被数据绑定到第一个列表。我希望DataTemplate与包含这两个列表的对象进行数据绑定。

我有一个带有两个字符串数组的对象。对象是绑定到列表框的数据。一个列表绑定为列表的ItemsSource。另一个是给我带来麻烦的东西,它需要绑定到一个组合框,该组合框是设置为列表的ItemTemplate的DataTemplate的一部分。基本上,列表框上的每个项目都有第一个列表的对应元素和包含第二个列表的组合框。换句话说,列表中的每个项目都有相同的选项组合框

问题来自这样一个事实,即DataTemplate被数据绑定到第一个列表。我希望DataTemplate与包含这两个列表的对象进行数据绑定。现在,如果可能的话,我无法确定在DataContext的“父”处需要什么样的绑定语法

有人能给我指出正确的方向吗


谢谢

我认为你不想做你想做的事。你是在要求痛苦

相反,您可能希望在集合中包含组合框的子集合的每个项中引用一个静态集合。因此:

//Pseudocode
TopLevelEntity
{
     SubLevelEntity[] SubItemsForComboBox;
}
这样,对于每个“TopLevelEntity”,您将准备好组合框的项目集合

<ListView ItemsSource="{StaticResource MyCollectionOfTopLevelEntities}">
    <ItemTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding SubItemsForComboBox} />
        </DataTemplate>
    </ItemTemplate>
</ListView>


如果我理解正确,您可以将ListBox的DataContext设置为类的实例(在我的示例中,我是通过:list.DataContext=myclass;)在代码中进行设置的),并且您希望将ListBox的ItemSource设置为类中的列表(即Items),将combobox的itemssource设置为类中的另一个列表(即值)。以下是我的xaml,它似乎很有效:

<ListBox Name="list" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding}"/>
                <ComboBox ItemsSource=
                          "{Binding RelativeSource={RelativeSource FindAncestor, 
                                                    AncestorType={x:Type ListBox}}, 
                                    Path=DataContext.Values}"
                />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

下面是我绑定到的类:

public class AClass
{

    protected List<string> _Items;
    public List<string> Items
    {
        get
        {
            if (_Items == null)
            {
                _Items = new List<string>();
            }
            return _Items;
        }
    }


    protected List<string> _Values;
    public List<string> Values
    {
        get
        {
            if (_Values == null)
            {
                _Values = new List<string>();
            }
            return _Values;
        }
    }
}
公共类AClass
{
受保护清单项目;
公共清单项目
{
得到
{
如果(_Items==null)
{
_项目=新列表();
}
退货(物品);;
}
}
受保护的列表值;
公共列表值
{
得到
{
如果(_值==null)
{
_值=新列表();
}
返回_值;
}
}
}

在代码中,我创建了一个AClass实例,添加了项和值,并将该实例设置为listbox的DataContext。

首先,正如Anderson所建议的那样,我建议您重新设计您的类,以从静态引用列表之外的某些位置获取Combobox项 但这里有一个解决当前场景的方法。 我假设您感兴趣的主要对象(“父对象”)是ListBox的DataContext。您希望在DataTemplateLevel中引用它。想法是走到列表框并获取数据上下文

 <Combobox DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" ItemsSource="{Binding YourCollection}" ....

需要查看所有XAML以帮助您完成此任务。从您的建议中我可以理解,缺点是每个项目都有一个组合框选项的重复列表。从技术上讲,您可以将它们全部设置为集合的同一实例,但重点是。太好了!这正是我想要达到的。谢谢你,马克!当我试图找到解决方案时,我意识到使用RelativeSource是关键,但在我看来,我希望在DataContext中找到一个成员,而不是ui元素层次结构。您的解决方案巩固了这样一个事实:RelativeSource只适用于UI元素,而不适用于它们包含的任何数据。再次感谢!很高兴我能帮忙。我在代码中也有类似的情况,在一个数据结构中有两个数组,一个用于对另一个进行分类。对于序列化,以这种方式构造它们是最有意义的,另外,如果需要,使用datacontext将允许我加载一个完全不同的集合。他们在WPF中设置这些东西的方式非常好。:)