将可见性绑定到可检查菜单项会在WPF中显示错误"服务提供程序缺少INameResolver服务"

CBe*_*nni 7 c# wpf

我试图通过上下文菜单显示/隐藏数据网格的列.我试图使用绑定,使用此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=TrueUpdateSourceTrigger=PropertyChanged.但是,当我选中/取消选中菜单项时,列不会更改其可见性.我究竟做错了什么?这在纯XAML中实际上是否可行?

这个问题中,答案使用了x:Reference.我也试过了,但收到了错误

服务提供商缺少INameResolver服务.

Google告诉我这是VS2010中的一个错误?我该怎么做才能解决这个问题?或者是我最好的切换到VS2012?

Ana*_*aev 5

以下是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)