在参考资料中绑定Datacontext

Hun*_*unv 6 c# wpf datacontext binding

我在DataGrid的资源中绑定值时遇到问题.在资源之外 - 标签它完美地工作,但在里面它不起作用.我想Datacontext可能已更改或为null.我不知道该怎么办.我读了一些关于freezables的内容,但我也没有让它们起作用.这是解决方案还是那个,我做不到的.这里我的代码与非工作和工作部分 - 仅用于演示.如果点击标题行,我需要在Resources-Section中使用Contextmenu才能获取它.

<UserControl x:Class="testapp.test.testManager.Window"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:testapp.test.testManager" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="600"
         DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">    
<Grid> 
    <DataGrid ItemsSource="{Binding Lst, UpdateSourceTrigger=PropertyChanged}" 
              AutoGeneratingColumn="dg_AutoGeneratingColumn">
        <DataGrid.Resources>
            <ContextMenu x:Key="DataGridColumnHeaderContextMenu">
                <MenuItem Header="{StaticResource General}">
                    <!-- HERE the Binding cannot find "TestCheck" -->
                    <CheckBox Content="Testentry Header" IsChecked="{Binding TestCheck, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"/>
        <!-- ... --->                    
                </MenuItem>                    
            </ContextMenu>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" />
            </Style>
        </DataGrid.Resources>           
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="{StaticResource General}">
                    <!-- Here the Binding can find "TestCheck" -->
                    <CheckBox Content="Testentry" IsChecked="{Binding TestCheck, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"/>
                    <!-- ... -->
                </MenuItem>
            </ContextMenu>
        </DataGrid.ContextMenu>            
    </DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

Roh*_*ats 6

问题ContextMenu 不在于与DataGrid相同的Visual树,因此无法继承DataGrid的DataContext.

您可以使用它x:Reference来获取DataGrid实例并使用它的DataContext进行绑定.(x:参考可从WPF 4.0获得)

x:NamedataGrid并绑定它:

<DataGrid ItemsSource="{Binding Lst, UpdateSourceTrigger=PropertyChanged}"
          x:Name="dataGrid">
   <DataGrid.Resources>
       <ContextMenu x:Key="DataGridColumnHeaderContextMenu">
         <MenuItem Header="{StaticResource General}">
            <CheckBox Content="Testentry Header"
                      IsChecked="{Binding DataContext.TestCheck,
                                          Source={x:Reference dataGrid}}"/>
....
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

您也可以使用Freezable类似于您提到的类来实现此目的.有关通过Freezable实现此目的的详细信息,请参阅此处的答案.