WPF:ItemsControl和DataContext

时间:2010-02-08 15:57:50

标签: c# wpf datacontext itemscontrol

我有一个主窗口,其中包含一个用户控件,名为SuperModeSuperMode由一组人组成,此集合中的每个人都有自己的任务集合。听起来很简单,对吧?

来自档案SuperMode.xaml

<UserControl 
    x:Class="Prototype.SuperMode"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Prototype"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> <!-- NOTE! -->
    <!-- Look at how I'm setting the DataContext, as I think it's
         important to solve the problem! -->

    <ScrollViewer CanContentScroll="True">
        <ItemsControl ItemsSource="{Binding People}" Margin="1">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Rows="1"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </ScrollViewer>

</UserControl>

这很好用,我可以按照我的预期看到四个的人!现在我所要做的就是让Person用户控件正确使用XAML,以便显示所有任务。

如您所见,我正在使用People属性用项填充控件。 People属性的类型为ObservableCollection<Person>,其中Person是另一个用户控件......

来自Person.xaml

<UserControl 
    x:Class="Prototype.Person"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Prototype">

    <Border Background="Black" CornerRadius="4" Margin="1">
        <ItemsControl ItemsSource="{Binding Tasks}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Border>

</UserControl>

Tasks此处是Person的属性,类型为ObservableCollection<Task>。这是卡住的地方!显然WPF无法找到任何Tasks属性并查看VS2008的输出窗口,我发现以下内容:

System.Windows.Data错误:39:BindingExpression路径错误:'object'''SuperMode'(Name ='SuperMode')'上找不到'Tasks'属性。 BindingExpression:路径=任务; DataItem ='SuperMode'(Name ='SuperMode'); target元素是'ItemsControl'(Name =''); target属性是'ItemsSource'(类型'IEnumerable')

现在我迷路了。我似乎必须在每个DataContext上设置Person属性,否则它仍会认为数据上下文是SuperMode,但我该怎么做?

1 个答案:

答案 0 :(得分:4)

忽略你所拥有的相当不愉快的设计(你应该研究MVVM),你应该能够为孩子DataContext设置UserControl,如下所示:

<ItemsControl ItemsSource="{Binding People}" Margin="1">
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="FrameworkElement.DataContext" Value="{Binding RelativeSource={RelativeSource Self}}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>