如何绑定到对象列表

时间:2012-04-06 13:45:05

标签: c# .net wpf xaml

我的要求是我需要将用户控件绑定到对象的Property,其列表包含在不同的对象中,第二个对象的列表设置为ItemsSource。

实施例

class A
{
    public string Name
    {
        get; set;
    }
}

class B
{
    public List<A> aObjectList;
}

List<B> bObjectsList = new List<B>();    
userControl.ItemSource = bObjectsList;
userControl.Content = new Binding("Name");

我如何做上述事情?

3 个答案:

答案 0 :(得分:2)

首先,如果您希望允许GUI在更改内容时自行更新,则应使用NotifyCollectionChanged的实现,例如ObservableCollection<T>

XAML看起来像这样:

   <ItemsControl Name="userControl">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource="{Binding aObjectsList}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

也就是说,假设您的UserControl是ItemsControl。然后在代码中执行:

 userControl.ItemsSource = bObjectsList;

一个好主意是查看MVVM模式。这将提供更加结构化的解决方案,允许修改通知等内容。

Here is a good article to get you started.

答案 1 :(得分:1)

这不是很明确,但我认为这就是你所要求的。你会绑定到

    bObjectsList[index].aObjectList 

在主要细节中,您使用以下语法

    ItemsSource="{binding ElementName=cbbObjectsList path=SelectedItem.aObjectList}"

答案 2 :(得分:0)

似乎对你要做的事情有很多解释。如果要展平列表,请使用SelectMany LINQ method

List<B> bObjectsList = new List<B>();    
userControl.ItemSource = bObjectsList.SelectMany(b => b.aObjectList);
userControl.Content = new Binding("Name");

如果A / B的内容发生变化,您可能会对它们使用ObservableCollection并做出相应的反应。