绑定在WrapPanel中的ObservableCollection <customclass>中包含的Usercontrol </customclass>

时间:2014-09-08 15:59:58

标签: wpf data-binding observablecollection wrappanel itemsource

我有一个以这种方式定义的课程:

    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>

现在我可以想象集合的第一个元素。如果第一个元素发生变化,我会想象出新的第一个元素。我如何可视化整个系列?

1 个答案:

答案 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,但这取决于您是否希望在其他地方重用该视图。