我有一个主窗口,其中包含一个用户控件,名为SuperMode
。 SuperMode
由一组人组成,此集合中的每个人都有自己的任务集合。听起来很简单,对吧?
来自档案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
,但我该怎么做?
答案 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>