在列表框中绑定Itemscontrol

时间:2014-08-09 04:08:32

标签: c# silverlight xaml windows-phone-8

我想在listbox中绑定我的itemscontrol,但它不起作用。我想用堆栈样式将一些FrameworkElement添加到Listbox。

这是我的XAML代码:

<ListBox x:Name="listThemes">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="5">
                        <Grid Grid.Column="1">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding Title}" FontWeight="Bold" />
                            <StackPanel Grid.Row="1" >
                                <ItemsControl  Width="Auto"
                                               Height="Auto"
                                               ItemsSource="{Binding ElementName=listThemes, Path=Items}">
                                </ItemsControl>
                            </StackPanel>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
</ListBox>

我不知道如何在ListBox中绑定ItemsControl。我尝试推出ItemsControl的Binding ElementName,但它总是崩溃。如果ElementName是页面名称,则不起作用。

测试类:

public class Testing
{
    public string Title { get; set; }
    public ObservableCollection<FrameworkElement> Items { get; set; }
}

C#代码:

        observableCollection = new ObservableCollection<FrameworkElement>();

        for (int i = 0; i < 3; i++)
        {
            observableCollection.Add(new Button { Content = i.ToString() });
            observableCollection.Add(new Canvas
            {
                Background = new ImageBrush()
                {
                    ImageSource = new BitmapImage(new Uri(@"Assets/ApplicationIcon.png", UriKind.Relative)),
                    Stretch = System.Windows.Media.Stretch.Fill
                },
                Height = 100,
                Width = 100
            });
        }

        List<Testing> list = new List<Testing>();
        for (int i = 0; i < 3; i++)
        {
            Testing test = new Testing();
            test.Title = "Testing";
            test.Items = observableCollection;

            list.Add(test);
        }

        listThemes.ItemsSource = list;

2 个答案:

答案 0 :(得分:0)

首先,它崩溃是因为你绑定了三个不同项目上的相同元素。一个框架元素不能在两个不同的控件下附加。因此,您应该将ObservableCollection放入List<Testing>创建过程中。

其次,您应该为DataContext控件设置listThemes,因此其项目可以找到要绑定的正确数据路径,然后您可以删除ElementName

试试这些代码。

List<Testing> list = new List<Testing>();
for (int i = 0; i < 3; i++)
{
    Testing test = new Testing();
    test.Title = "Testing";

    var observableCollection = new ObservableCollection<FrameworkElement>();

    for (int j = 0; i < 3; i++)
    {
        observableCollection.Add(new Button { Content = j.ToString() });
        observableCollection.Add(new Canvas
        {
            Background = new ImageBrush()
            {
                ImageSource = new BitmapImage(new Uri(@"Assets/ApplicationIcon.png", UriKind.Relative)),
                Stretch = System.Windows.Media.Stretch.Fill
            },
            Height = 100,
            Width = 100
        });
    }

    test.Items = observableCollection;

    list.Add(test);
}

listThemes.DataContext = list;
listThemes.ItemsSource = list;

第三,我认为这不是将FrameworkElement直接绑定到ItemsControl的好方法。它看起来很奇怪。

更新

如果要生成不同类型的项目,可以使用DataTemplateSelector。因为您已经将论坛数据解析为不同的类型,所以请查看此帖子:

How to Control the DataTemplateSelector in Windows Store Apps

它解释了如何使用DataTemplateSelector显示不同类型的数据。

答案 1 :(得分:0)

为什么你的内部集合是FrameworkElement类型? 为它创建一个自定义类型,并为内部ItemsControl设置一个ItemTemplate。

<DataTemplate x:Key=NestedItemsTemplate>
    ....
</DataTemplate>


<ListBox x:Name="listThemes"
         ItemsSource="{Binding TestItems}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="5">
                    <Grid Grid.Column="1">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding Title}" FontWeight="Bold" />
                        <StackPanel Grid.Row="1" >
                            <ItemsControl 
                                Width="Auto" Height="Auto"
                                ItemsSource="{Binding ElementName=listThemes, Path=Items}"
                                ItemTemplate="{StaticResource NestedItemsTemplate}">
                            </ItemsControl>
                        </StackPanel>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>