在参考资料中绑定Datacontext

时间:2014-02-02 00:15:10

标签: c# wpf binding datacontext

我在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>

2 个答案:

答案 0 :(得分:6)

问题是ContextMenu 与DataGrid 不在同一个Visual树中,因此无法继承DataGrid的DataContext。

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

x:Name提供给dataGrid并与之绑定:

<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>

此外,您可以使用您提到的Freezable类来实现此目的。有关通过Freezable实现此目的的详细信息,请参阅我在here上的回答。

答案 1 :(得分:0)

我对前面的帖子评论太快了(我删除了它)。 两种方式都有效,但是当我尝试使用字典时,两种方式都无法正常工作。

这有效:

<CheckBox Content="Test" IsChecked="{Binding Path=Data.TestCheck, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>

这不是:

<CheckBox Content="Test" IsChecked="{Binding Path=Data.MyCheckState[MachineName], Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>

这两个属性的定义如下:

    public Dictionary<string, bool> MyCheckState
    {
        get { return _MyCheckState; }
    }

    public bool TestCheck
    {
        get { return true; }
    }