我在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>
答案 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; }
}