Wpf 如何在窗口资源中将DataContext绑定到ViewModel对象
我正在尝试将usercontrol datacontext绑定到viewmodel对象。由于未知原因,在窗口内设置DataContext。因此,参考资料提供 System.Windows.Data错误:3:找不到提供 数据上下文。BindingExpression:Path=AreaFilter;DataItem=null 在window.resources之外设置相同的datacontext效果很好。这段代码应该能把事情弄清楚:Wpf 如何在窗口资源中将DataContext绑定到ViewModel对象,wpf,mvvm,binding,datacontext,Wpf,Mvvm,Binding,Datacontext,我正在尝试将usercontrol datacontext绑定到viewmodel对象。由于未知原因,在窗口内设置DataContext。因此,参考资料提供 System.Windows.Data错误:3:找不到提供 数据上下文。BindingExpression:Path=AreaFilter;DataItem=null 在window.resources之外设置相同的datacontext效果很好。这段代码应该能把事情弄清楚: <Window> <Window.Resour
<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,我目前简化为只显示一个textblock。
在网格内,它显示AreaFilter.Name,没有问题。
在这两种情况下设置DataContext有什么区别?如何解决这个问题?我认为
GridViewColumn
实际上不是VisualTree
的一部分,因此它中的绑定不起作用,因为在评估绑定时没有DataContext
或源代码
您可以尝试使用引用您的GridView的RelativeSource
绑定来设置DataContext
<GridViewColumn.HeaderTemplate>
<DataTemplate>
<v:FilterV DataContext="{Binding DataContext.AreaFilter,
RelativeSource={RelativeSource AncestorType={x:Type GridView}}}"/>
</DataTemplate>
</GridViewColumn.HeaderTemplate>
您可以查看此示例
此外,您应该将GridViewHeaderTemplate
属性设置为包含
控件的DataTemplate
,而不是像现在一样直接在.Content
属性中设置它。将内容
直接设置为对象意味着使用该样式的任何项目都将尝试使用内容
中的相同控件,因此,如果有多个对象应用了该内容
属性,它将引发异常,因为项只能属于一个父控件像这样使用的绑定引用另一个DataContext。因此,即使您设置了DataContext,也需要另一个有效的DataContext才能从中获取属性AreaFilter。我不确定我是否清楚地理解它。我尝试在不同的列中使用它(在我简化代码的示例中),并且在每一列中它都必须绑定到不同的对象。这就是我试图在ColumnCollection中设置DataContext的原因。如果我定义了一个包含v:FilterV的数据模板,我不知道在哪里将不同的VM对象绑定到每个FilterV。希望你的回答能对我的问题有所帮助!
<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>