Wpf 如何在窗口资源中将DataContext绑定到ViewModel对象

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

我正在尝试将usercontrol datacontext绑定到viewmodel对象。由于未知原因,在窗口内设置DataContext。因此,参考资料提供

System.Windows.Data错误:3:找不到提供 数据上下文。BindingExpression:Path=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,我目前简化为只显示一个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>