我的要求是我需要将用户控件绑定到对象的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");
我如何做上述事情?
答案 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模式。这将提供更加结构化的解决方案,允许修改通知等内容。
答案 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并做出相应的反应。