我试图通过上下文菜单显示/隐藏数据网格的列。我试图使用绑定,使用此XAML:
<Grid>
<DataGrid AutoGenerateColumns="False" Name="dataGrid1">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Show Column 1" IsCheckable="True"
x:Name="showcol1" IsChecked="True" />
<MenuItem Header="Show Column 2" IsCheckable="True"
x:Name="showcol2" IsChecked="False" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTextColumn Header="Col 0" />
<DataGridTextColumn Header="Col 1"
Visibility="{Binding ElementName=showcol1,
Converter={StaticResource BooleanToVisibilityConverter},
Path=IsChecked}" />
<DataGridTextColumn Header="Col 2"
Visibility="{Binding ElementName=showcol2,
Converter={StaticResource BooleanToVisibilityConverter},
Path=IsChecked}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
我甚至尝试过其他选项,例如BindsDirectlyToSource=True
和UpdateSourceTrigger=PropertyChanged
。但是,当我选中/取消选中菜单项时,列不会更改其可见性。我究竟做错了什么?这在纯XAML中实际可行吗?
在this问题中,答案使用x:Reference
。我也试过了,但收到了错误
谷歌告诉我这是VS2010中的一个错误?我该怎么做才能解决这个问题?或者是我最好的切换到VS2012?服务提供商缺少INameResolver服务。
答案 0 :(得分:4)
以下是Adam Nathan's WPF 4 unleashed book
的解释(我建议所有人阅读):
x:参考标记扩展通常与XAML2009功能错误关联,这些功能只能在撰写本文时从松散的XAML中使用。虽然x:Reference是WPF 4中的一个新功能,但只要您的项目针对.NET Framework的版本4或更高版本,就可以在XAML2006中使用它。一个小故障是Visual Studio 2010中的XAML设计器无法正确处理x:Reference,因此它提供了以下设计时错误,您可以放心地忽略: 服务提供商缺少INameResolver服务。
在任何情况下,此消息都可以忽略。对于我的Visual Studio 2010
,它有时会显示,有时则不会。
修改强>
我发现了另一个引用(source),但它们没有提供具体的解决方案:
当使用{x:Reference}作为WPF标签的目标时,Visual Studio设计器会抛出InvalidOperationException异常,并显示消息“服务提供程序缺少INameResolver服务”。该项目将编译和执行没有任何问题,但由于异常,将禁用出现x:Reference的设计画布。在本书撰写时,这是一个已知问题,应该在将来的某个时候解决。
Here,作者专门解释了问题,并写了将错误报告发送给Microsoft
。
BooleanToVisibilityConverter
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
DataGrid XAML
<DataGrid AutoGenerateColumns="False" Name="dataGrid1">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem x:Name="showcol1" Header="Show Column 1" IsCheckable="True" IsChecked="True" />
<MenuItem x:Name="showcol2" Header="Show Column 2" IsCheckable="True" IsChecked="False" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTextColumn Header="Col 0" />
<DataGridTextColumn Header="Col 1" Visibility="{Binding Source={x:Reference Name=showcol1}, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
<DataGridTextColumn Header="Col 2" Visibility="{Binding Source={x:Reference Name=showcol2}, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
</DataGrid.Columns>
</DataGrid>