我正在尝试将usercontrol datacontext绑定到viewmodel对象。由于未知原因,将Window.Resources中的DataContext设置为结果
System.Windows.Data错误:3:找不到提供的元素 DataContext的。 BindingExpression:路径= AreaFilter;的DataItem = NULL;
在window.resources之外设置相同的datacontext是完美的。一段代码应该清除一切:
<Window>
<Window.Resources>
<GridViewColumnCollection x:Key="eventColumns">
<GridViewColumn DisplayMemberBinding="{Binding Path=Area}">
<GridViewColumn.Header>
<v:FilterV DataContext="{Binding AreaFilter}"/> <!--here is the problem-->
</GridViewColumn.Header>
</GridViewColumn>
</GridViewColumnCollection>
</Window.Resources>
<Grid>
<v:FilterV DataContext="{Binding AreaFilter}"/> <!-- here it works OK -->
<GridViewHeaderRowPresenter Name="listHeader" Columns="{StaticResource eventColumns}"/>
</Grid>
FilterV是我目前简化为仅显示文本块的UserControl。 在网格内部,它显示AreaFilter.Name没有问题。 在这两种情况下设置DataContext以及如何解决这个问题有什么区别?
答案 0 :(得分:2)
我认为GridViewColumn
实际上不是VisualTree
的一部分,因此它中的绑定将无效,因为它在评估绑定时没有DataContext
或源使用
您可以尝试使用引用DataContext
的{{1}}绑定设置RelativeSource
GridView
虽然如果这不起作用,我发现的唯一解决方法是在<GridViewColumn.HeaderTemplate>
<DataTemplate>
<v:FilterV DataContext="{Binding DataContext.AreaFilter,
RelativeSource={RelativeSource AncestorType={x:Type GridView}}}"/>
</DataTemplate>
</GridViewColumn.HeaderTemplate>
中创建包含您正在寻找的绑定的Freezeable对象,然后设置{{1}到静态资源
.Resources
您可以查看此here
的示例此外,您应该将v:FilterV.DataContext
属性设置为包含<GridView.Resources>
<local:BindingProxy x:Key="proxy"
Data="{Binding AreaFilter, ElementName=MyGridView}" />
</DataGrid.Resources>
...
<GridViewColumn.HeaderTemplate>
<DataTemplate>
<v:FilterV DataContext="{Binding Source={StaticResource proxy}}"/>
</DataTemplate>
</GridViewColumn.HeaderTemplate>
控件的GridViewHeaderTemplate
,而不是像现在一样直接在DataTemplate
属性中设置它。将<v:FilterV />
直接设置为对象意味着使用该样式的任何项目都将尝试在.Content
中使用相同的控件,因此如果您有多个对象应用Content
属性它将抛出异常,因为项只能属于一个父控件