我有一个以这种方式定义的课程:
public class CustomClass
{
string Name;
int Age;
Usercontrol usercontrol;
}
其中Usercontrol是我想要在WrapPanel中插入的可视元素。
CustomClass以静态ObservableCollection组织。
public static class CollectionClass
{
public static ObservableCollection<CustomClass> MyCollection = new ObservableCollection<CustomClass>();
}
我希望绑定集合中CustomClass的usercontrol属性,以便在WrapPanel中可视化,因此我的可视元素的显示顺序与集合中的元素相同。
现在我通过代码手动填充WrapPanel,但我认为必须有一种方法可以通过数据绑定快速轻松地完成。 我试图用这样定义的ItemsControl来做它:
<ItemsControl Name="SensorMenuWrap" ItemsSource="{Binding }">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
但我不知道如何让魔术发生。
修改
我尝试了ChrisO提出的解决方案,实现方式如下:
1 - 我把这个集合变成了一个属性
2 - 我将UserControl设为属性
3 - 我从代码中设置了DataContex:
SensorMenuWrap.Datacontext = CollectionClass.MyCollection
4 - 绑定:
<ItemsControl Name="SensorMenuWrap" ItemsSource="{Binding }">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding usercontrol}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在我可以想象集合的第一个元素。如果第一个元素发生变化,我会想象出新的第一个元素。我如何可视化整个系列?
答案 0 :(得分:0)
我还没有测试过这个。此外,请确保userControl是属性而不是字段。我假设您知道如何正确设置DataContext以引用MyCollection属性。
<ItemsControl Name="SensorMenuWrap" ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding userControl}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
您还应该考虑直接引用DataTemplate中的UserControl,而不是将其作为类的属性绑定到它。这看起来像这样
<ItemsControl Name="SensorMenuWrap" ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
修改强>
为了响应您的编辑,您可以使用CustomClass属性上的可重复使用的UserControl和DataBindings来解决这个问题。这就是我必须实现的目标:
<强> CollectionClass 强>
public static class CollectionClass
{
public static ObservableCollection<CustomClass> MyCollection { get; set; }
static CollectionClass()
{
MyCollection = new ObservableCollection<CustomClass>();
MyCollection.Add(new CustomClass { Age = 25, Name = "Hamma"});
MyCollection.Add(new CustomClass { Age = 32, Name = "ChrisO"});
}
}
<强> CustomClass 强>
public class CustomClass
{
public string Name { get; set; }
public int Age { get; set; }
}
UserControl内容
<StackPanel>
<TextBlock Background="Tan" Text="{Binding Name}" />
<TextBlock Background="Tan" Text="{Binding Age}" />
</StackPanel>
<强>主窗口强>
<ItemsControl Name="SensorMenuWrap" ItemsSource="{Binding }">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<so25728310:Usercontrol Margin="5" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
此处,您不必将Usercontrol添加到数据中,而是将其保留在视图中。在视图和数据之间进行分离总是好的。您甚至可以取消Usercontrol并直接在DataTemplate中使用两个TextBox,但这取决于您是否希望在其他地方重用该视图。