0

我的要求是我需要将用户控件绑定到对象的属性,该对象的列表包含在不同的对象中,并且第二个对象的列表设置为 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");

我该怎么做上面的事情???

4

3 回答 3

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 模式。这将提供一个更结构化的解决方案,允许修改通知等。

这是一篇很好的文章,可以帮助您入门。

于 2012-04-06T13:55:53.720 回答
1

这不是很清楚,但我认为这就是您要问的。你会绑定到

    bObjectsList[index].aObjectList 

在主详细信息中,您使用以下语法

    ItemsSource="{binding ElementName=cbbObjectsList path=SelectedItem.aObjectList}"
于 2012-04-06T13:56:41.790 回答
0

似乎对您要尝试做的事情有很多解释。如果要展平列表,请使用SelectMany LINQ 方法

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

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

于 2012-04-06T13:57:55.287 回答