我试图通过上下文菜单显示/隐藏数据网格的列.我试图使用绑定,使用此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>
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过其他选项,例如BindsDirectlyToSource=True和UpdateSourceTrigger=PropertyChanged.但是,当我选中/取消选中菜单项时,列不会更改其可见性.我究竟做错了什么?这在纯XAML中实际上是否可行?
在这个问题中,答案使用了x:Reference.我也试过了,但收到了错误
服务提供商缺少INameResolver服务.
Google告诉我这是VS2010中的一个错误?我该怎么做才能解决这个问题?或者是我最好的切换到VS2012?
以下是Adam Nathan's WPF 4 unleashed book(我建议大家阅读)的解释:
在撰写本文时,x:Reference 标记扩展经常被错误地与 XAML2009 功能相关联,这些功能只能从松散的 XAML 中使用。尽管 x:Reference 是 WPF 4 中的一项新功能,但只要您的项目面向 .NET Framework 版本 4 或更高版本,它就可以从 XAML2006 中正常使用。一个小故障是 Visual Studio 2010 中的 XAML 设计器没有正确处理 x:Reference,因此它给出了您可以放心忽略的以下设计时错误:服务提供程序缺少 INameResolver 服务。
在任何情况下,都可以忽略此消息。对于我的Visual Studio 2010,它有时会出现,有时不会。
编辑:
我又找到了一个引用(来源),但他们没有提供具体的解决方案:
使用 {x: Reference } 作为 WPF 标签的目标时,Visual Studio 设计器会引发 InvalidOperationException 异常并显示消息“服务提供程序缺少 INameResolver 服务”。该项目将编译并执行而不会出现任何问题,但出现 x: 引用的设计画布将因异常而被禁用。在撰写本书时,这是一个已知问题,应该在未来某个时候解决。
在这里,作者专门说明了问题,并写道将错误报告发送到Microsoft.
BooleanToVisibilityConverter
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |