在资源中绑定Datacontext

6

我在DataGrid的Resource中绑定值时遇到了问题。 在resources标签外部,它完美地工作,但在内部却不起作用。我认为可能是数据上下文已更改或为空。 我不知道该怎么办。我读到了一些关于freezables的东西,但我也没能让它们起作用。 这是我的代码,包括不起作用和起作用的部分 - 仅供演示。 我需要在资源部分中使用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个回答

7
问题在于ContextMenuDataGrid不在同一可视树中,因此无法继承DataGrid的DataContext。

您可以使用x:Reference获取DataGrid实例并将其与其DataContext绑定。 (x:Reference从WPF 4.0开始提供)

给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实现。


-1

我在评论前太快了(我已经删除了它)。

两种方法都可以工作,但是当我尝试使用字典时,两种方法都无法工作。

这个可以工作:

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

对我来说,两种情况都有效。请确保您的字典中存在“MachineName”键。 - Rohit Vats
好的,Rohit,你是对的。两个都可以工作...每次测试时,当你忘记更改值时:)关键字不存在。 - Hunv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接