gpt4 book ai didi

c# - 在资源中绑定(bind)数据上下文

转载 作者:太空狗 更新时间:2023-10-29 21:33:59 26 4
gpt4 key购买 nike

我在绑定(bind) DataGrid 的资源中的值时遇到问题。在 resources-Tag 之外它工作得很好,但在里面它不起作用。我认为 Datacontext 可能已更改或为空。我不知道该怎么办。我读了一些关于 freezables 的东西,但我也没有让它们工作。这是解决方案还是我正在做的事情是不可能的。这是我的非工作部分和工作部分的代码 - 仅用于演示。如果单击标题行,我需要资源部分中的上下文菜单才能获取它。

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

最佳答案

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

您可以使用 x:Reference 获取 DataGrid 实例并与其 DataContext 绑定(bind)。 (x:引用可从 WPF 4.0 获得)

x:Name 赋给 dataGrid 并与之绑定(bind):

<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 类来实现。引用我对here的回答了解通过 Freezable 实现该目标的详细信息。

关于c# - 在资源中绑定(bind)数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com